Menu

Datas no R: as.Date, format() e Aritmética de Datas

A classe Date do R é uma contagem de dias usando uma fantasia. Como interpretar strings com as.Date, formatar datas para exibição, subtraí-las, construir sequências e quando você precisa de POSIXct.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Uma Data no R É uma Contagem de Dias Usando uma Fantasia

Para transformar uma string em uma data de verdade, use as.Date(); para obter hoje, use Sys.Date(). Por trás de ambos há um truque simples: a classe Date do R é apenas um número - a contagem de dias desde 1º de janeiro de 1970 - com uma fantasia que o faz imprimir como uma data de calendário. Você pode tirar a fantasia com unclass():

Aquele 20672 é a contagem bruta de dias, e é o que faz todo o resto desta página funcionar: comparações, subtração e sequências são, por baixo, apenas aritmética de inteiros. A fantasia é o que torna o valor usável - o mesmo número imprime como data, formata como data e aparece em um eixo de datas nos gráficos.

as.Date() interpreta sem ajuda o layout ISO "YYYY-MM-DD", o que é um dos vários bons motivos para armazenar datas nesse formato nos seus arquivos. Um hábito para criar cedo: um parsing que falha retorna NA silenciosamente - não um erro - então sempre dê uma olhada no resultado depois de interpretar algo novo.

Strings que apenas parecem datas continuam sendo apenas strings: "2026-08-07" < "2026-11-01" por acaso compara corretamente porque a ordem ISO coincide com a ordem alfabética, mas "07/08/2026" ordena como um disparate. Converta primeiro, depois compare.

Interpretando Outros Layouts com format =

O mundo não escreve datas em ISO. Para todo o resto, as.Date() aceita um argumento format =: uma receita descrevendo a string de entrada, construída com códigos %.

As três interpretam para o mesmo dia. A receita precisa corresponder exatamente à string, separadores incluídos: "%d/%m/%Y" não vai interpretar "07-08-2026". Os códigos que você realmente vai usar:

CódigoSignificadoExemplo
%YAno com 4 dígitos2026
%yAno com 2 dígitos26
%mNúmero do mês08
%dDia do mês07
%bNome abreviado do mêsAug
%BNome completo do mêsAugust
%aDia da semana abreviadoFri
%ADia da semana completoFriday
%HHora (00-23)14
%MMinuto30
%SSegundo05

A emboscada clássica é a própria "07/08/2026": dia/mês/ano na maior parte do mundo, mês/dia/ano nos EUA, e o R não tem como adivinhar qual delas o seu arquivo quer dizer. Pior: um palpite errado muitas vezes "funciona" - as duas leituras são datas válidas - até que o dia 13 de algum mês chega e vira NA (não existe 13º mês). Conheça a convenção dos seus dados antes de escrever a receita.

Formatando Datas para Saída

format() é a imagem espelhada de as.Date(): os mesmos códigos %, rodando na direção oposta - Date entra, string sai.

Use isso para títulos de relatórios, rótulos e nomes de arquivos - format(Sys.Date(), "%Y-%m-%d") gera nomes que ordenam cronologicamente. Dois detalhes que valem a pena saber: %d preenche com zero ("August 07"), e %B/%A produzem nomes no idioma configurado no seu sistema - uma sessão configurada em alemão imprime "Freitag" em vez de "Friday". Mantenha a formatação nas bordas do seu script, para humanos; internamente, deixe as datas como Dates.

Aritmética de Datas e Sequências

Como uma Date é uma contagem de dias, a aritmética funciona do jeito que você espera. Subtrair duas datas dá um objeto difftime:

Três hábitos para levar desse bloco. Primeiro, envolva um difftime em as.numeric() antes de fazer contas com ele - o difftime carrega um atributo de unidades que pode surpreender cálculos posteriores. Segundo, quando as unidades importam, declare-as com difftime(units = ) em vez de aceitar o que o R escolher. Terceiro, somar um número puro significa somar dias - não existe + 1 mês no R base, porque "um mês" não é um número fixo de dias.

Para avançar respeitando o calendário, use seq(), que entende "day", "week", "month", "quarter" e "year":

Sequências mensais são a ferramenta padrão para períodos de relatório e marcações de eixo. Uma peculiaridade: comece uma sequência mensal no dia 31 e o R continua contando dias reais através de meses que não têm esse dia, então a entrada de "fevereiro" cai no início de março. Ancore sequências mensais no dia 1º e derive qualquer outra coisa a partir daí.

Extraindo Partes de uma Data

O R base tem dois extratores de conveniência e um idioma geral. weekdays() e months() retornam nomes; para números, faça a ida e volta por format():

O movimento format() seguido de as.integer() parece indireto, mas é o idioma padrão do R base, e é vetorizado - entregue uma coluna inteira de datas e você recebe de volta uma coluna inteira de anos. É exatamente o que você quer depois de importar um conjunto de dados datado de um arquivo CSV: interprete a coluna de datas uma vez com as.Date() e depois derive colunas de ano e mês para agrupamento.

Quando Dias Não Bastam: POSIXct e lubridate

Date não tem noção de horas. No momento em que seus dados têm timestamps - entradas de log, leituras de sensores, "pedido feito às 14:32" - você precisa de POSIXct, a classe de data-hora do R: segundos desde 1970 em vez de dias, e ciente de fuso horário.

Tudo se transfere: os mesmos códigos % (agora incluindo %H, %M, %S) funcionam para parsing e para format(), a subtração dá difftimes, Sys.time() é o "agora". O novo fardo é o fuso horário - passe tz = explicitamente ao interpretar, porque duas sessões em fusos diferentes vão, caso contrário, ler a mesma string como dois instantes diferentes. E resista a armazenar dados de calendário como POSIXct "por via das dúvidas": um aniversário armazenado como meia-noite-em-algum-fuso pode imprimir como o dia anterior em outro fuso, um bug genuinamente miserável de rastrear. Dias inteiros: Date. Instantes: POSIXct.

Por fim, o pacote lubridate é a cara mais amigável que a maior parte do código tidyverse coloca sobre tudo isso - vale adotar depois que a mecânica do R base fizer sentido:

library(lubridate)

ymd("2026-08-07")            # order-based parsing: no format string
mdy("08/07/2026")            # ...you just say which order the parts come in
dmy("7 August 2026")
floor_date(Sys.Date(), "month")   # snap to the start of the period

ymd(), mdy() e dmy() substituem receitas de formato por uma simples declaração da ordem das partes, e floor_date() resolve "agrupar esses timestamps por mês" em uma chamada. O lubridate roda sobre as mesmas classes Date/POSIXct por baixo - um volante melhor, não um motor diferente.

O Que Você Leva

  • Uma Date é uma contagem de dias desde 1970-01-01 fantasiada para imprimir como data; unclass() mostra o número.
  • as.Date("2026-08-07") interpreta ISO diretamente; qualquer outra coisa precisa de uma receita format = de códigos % - e um parsing que falha retorna NA, silenciosamente.
  • format(date, "...") é o inverso: os mesmos códigos, produzindo strings de exibição.
  • Subtração dá um difftime - defina units = explicitamente, as.numeric() antes de fazer contas. + n soma dias; para meses, use seq(by = "month").
  • weekdays(), months() e o idioma as.integer(format(...)) extraem partes, de forma vetorizada.
  • Date para dias inteiros, POSIXct (com tz explícito) para timestamps; o lubridate torna ambos mais amigáveis.

A seguir: o que fazer quando o R grita com você - ler mensagens de erro e depurá-las metodicamente.

Perguntas frequentes

Como converter uma string em data no R?

Com as.Date(). Se a string está no formato ISO, funciona direto: as.Date("2026-08-07"). Qualquer outro layout precisa de uma receita format = construída com códigos %: as.Date("07/08/2026", format = "%d/%m/%Y"). Um parsing que falha retorna NA em vez de um erro, então confira o resultado.

Como obter a data de hoje no R?

Sys.Date() retorna hoje como um objeto Date; Sys.time() retorna a data-hora atual como POSIXct. Ambos vêm do relógio e do fuso horário configurados no seu computador.

Como calcular a diferença entre duas datas no R?

Subtraia uma da outra: as.Date("2026-08-07") - as.Date("2026-01-01") dá um difftime de 218 dias. Envolva em as.numeric() para usar o número em cálculos, ou chame difftime(d1, d2, units = "weeks") para escolher você mesmo a unidade em vez de deixar o R decidir.

Qual é a diferença entre Date e POSIXct no R?

Date armazena dias inteiros (internamente: dias desde 1970-01-01) e não sabe nada sobre horas ou fusos horários. POSIXct armazena um instante no tempo (segundos desde 1970) e é ciente de fuso horário. Use Date para dados de calendário, como aniversários e prazos; use POSIXct apenas quando a hora do dia importa, como timestamps e logs.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR