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ódigo | Significado | Exemplo |
|---|---|---|
%Y | Ano com 4 dígitos | 2026 |
%y | Ano com 2 dígitos | 26 |
%m | Número do mês | 08 |
%d | Dia do mês | 07 |
%b | Nome abreviado do mês | Aug |
%B | Nome completo do mês | August |
%a | Dia da semana abreviado | Fri |
%A | Dia da semana completo | Friday |
%H | Hora (00-23) | 14 |
%M | Minuto | 30 |
%S | Segundo | 05 |
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 receitaformat =de códigos%- e um parsing que falha retornaNA, 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.+ nsoma dias; para meses, useseq(by = "month"). weekdays(),months()e o idiomaas.integer(format(...))extraem partes, de forma vetorizada.Datepara dias inteiros,POSIXct(comtzexplí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.