Pandas: Data e Hora

Última atualização: 2026-08-26

O primeiro passo na análise de séries temporais é converter datas em formato string para tipos datetime do Pandas. O DatetimeIndex permite agregar por semana, mês ou trimestre; o acessor dt permite decompor datas como se fosse strings; e o Timedelta simplifica a aritmética com datas. Esta seção aborda o sistema de tipos datetime, parsing, extração e aritmética.

⚠️ Nota: O código abaixo requer um ambiente local de Python para ser executado.

1. What You Will Learn


2. O Dilema do Tempo da Estação Meteorológica de Charlie

(1) Ponto de Dor: Datas São Strings, Tornando a Agregação Mensal Impossível

Os dados da estação meteorológica de Charlie armazenam datas como strings, impossibilitando estatísticas mensais:

PYTHON
import pandas as pd

df = pd.DataFrame({
    'date_str': ['2024-01-15', '2024-01-20', '2024-02-10', '2024-02-28', '2024-03-15'],
    'temperature': [5.2, 3.8, 8.1, 9.5, 12.3]
})
# df.groupby(df['date_str'].str[:7]) — hack frágil!
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

(2) Solução: to_datetime + dt

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: parsing e extração com to_datetime (Dificuldade ⭐)

PYTHON
import pandas as pd

df = pd.DataFrame({
    'date_str': ['2024-01-15', '2024-01-20', '2024-02-10', '2024-02-28', '2024-03-15'],
    'temperature': [5.2, 3.8, 8.1, 9.5, 12.3]
})

# Converter string para datetime
df['date'] = pd.to_datetime(df['date_str'])

# Extrair mês para agrupamento
df['month'] = df['date'].dt.month

# Agrupar por mês
monthly = df.groupby('month')['temperature'].mean()
print(monthly)
# month
# 1     4.50
# 2     8.80
# 3    12.30
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

3. Sistema de Tipos de Data e Hora do Pandas

(1) Quatro Tipos de Data e Hora

Tipo Propósito Exemplo
Timestamp Um único ponto no tempo pd.Timestamp('2024-01-15')
DatetimeIndex Uma sequência de timestamps pd.date_range('2024-01', periods=3, freq='M')
Timedelta Uma duração entre dois pontos pd.Timedelta(days=7)
Period Um intervalo de tempo pd.Period('2024-01', freq='M')

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Criando tipos de data e hora (Dificuldade ⭐)

PYTHON
import pandas as pd

# Timestamp — ponto único no tempo
ts = pd.Timestamp('2024-01-15 10:30:00')
print(ts.year, ts.month, ts.day, ts.hour)
# 2024 1 15 10

# DatetimeIndex — sequência de timestamps
idx = pd.date_range('2024-01-01', periods=5, freq='D')
print(idx)
# DatetimeIndex(['2024-01-01', '2024-01-02', ...], dtype='datetime64[ns]')

# Timedelta — duração
delta = pd.Timedelta(days=7, hours=3)
print(delta)  # 7 days 03:00:00
print(ts + delta)  # 2024-01-22 13:30:00

# Period — intervalo de tempo (mês/trimestre/ano)
p = pd.Period('2024-Q1', freq='Q')
print(p.start_time, p.end_time)
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

4. pd.to_datetime

(1) Análise de Múltiplos Formatos

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e siga alongamento. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: análise multi-formato do to_datetime (Dificuldade ⭐⭐)

PYTHON
import pandas as pd

# Formato ISO (detectado automaticamente)
dates1 = pd.to_datetime(['2024-01-15', '2024-02-20', '2024-03-10'])
print(dates1)

# Formatos mistos
dates2 = pd.to_datetime(['01/15/2024', 'Feb 20, 2024', '20240310'])
print(dates2)

# Especificar formato explicitamente (mais rápido para grandes volumes de dados)
dates3 = pd.to_datetime(['15-01-2024', '20-02-2024'], format='%d-%m-%Y')
print(dates3)

# Lidar com erros
bad_dates = pd.to_datetime(
    ['2024-01-15', 'not-a-date', '2024-03-10'],
    errors='coerce'  # inválido → NaT (não errors='raise')
)
print(bad_dates)
# DatetimeIndex(['2024-01-15', 'NaT', '2024-03-10'])

# Timestamp Unix
unix_ts = pd.to_datetime([1705276800, 1707974400], unit='s')
print(unix_ts)
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e siga alongamento. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

(2) Códigos de Formato Comuns

Código Significado Exemplo
%Y Ano com 4 dígitos 2024
%m Mês com 2 dígitos 01
%d Dia com 2 dígitos 15
%H Relógio de 24 horas 14
%M Minuto 30
%S Segundo 00
%b Nome abreviado do mês Jan
%B Nome completo do mês Janeiro
%a Dia da semana abreviado Seg

5. Acessor .dt

(1) Extraindo Propriedades de Datetime

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: propriedades do acessor dt (Dificuldade ⭐⭐)

PYTHON
import pandas as pd

df = pd.DataFrame({
    'timestamp': pd.date_range('2024-01-15 08:30:00', periods=5, freq='12h')
})

# Extrair componentes da data
df['year'] = df['timestamp'].dt.year
df['month'] = df['timestamp'].dt.month
df['day'] = df['timestamp'].dt.day
df['hour'] = df['timestamp'].dt.hour
df['day_of_week'] = df['timestamp'].dt.dayofweek  # 0=Seg, 6=Dom
df['day_name'] = df['timestamp'].dt.day_name()     # Monday, Tuesday...
df['is_weekend'] = df['timestamp'].dt.dayofweek >= 5
df['quarter'] = df['timestamp'].dt.quarter

print(df[['timestamp', 'month', 'day_name', 'is_weekend', 'quarter']])
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

(2) Métodos dt

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: operações de métodos dt (Dificuldade ⭐)

PYTHON
import pandas as pd

dates = pd.Series(pd.date_range('2024-01-15', periods=5, freq='2D'))

# Converter para período
print(dates.dt.to_period('M'))  # períodos mensais

# Normalizar para meia-noite (remover componente de tempo)
print(dates.dt.normalize())

# Arredondar para a hora mais próxima
timestamps = pd.Series(pd.date_range('2024-01-15 08:35:00', periods=3, freq='45min'))
print(timestamps.dt.round('h'))  # arredondar para a hora mais próxima

# Arredondar para baixo / Para cima
print(timestamps.dt.floor('h'))  # arredondar para baixo
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

6. Aritmética com Timedelta

(1) Adição e Subtração de Datas

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e siga junto. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Aritmética com timedelta (Dificuldade ⭐⭐)

PYTHON
import pandas as pd

# Cria timestamps
start = pd.Timestamp('2024-01-15')
deadline = start + pd.Timedelta(days=30)
print(f"Deadline: {deadline}")

# Diferença entre datas
delivery = pd.Timestamp('2024-02-10')
delay = delivery - deadline
print(f"Delay: {delay.days} dias")  # -4 dias (adiantado)

# Timedelta a partir de string
td = pd.to_timedelta('5 days 3 hours')
print(td)

# Operações em Series
df = pd.DataFrame({
    'order_date': pd.date_range('2024-01-01', periods=5),
    'delivery_days': [3, 5, 2, 7, 4]
})
df['delivery_date'] = df['order_date'] + pd.to_timedelta(df['delivery_days'], unit='D')
df['is_late'] = df['delivery_days'] > 5
print(df)
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e siga junto. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

7. date_range e Frequência

(1) Gerando Sequências de Datas

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeramente dependendo da versão do pandas.

: Geração de datas com date_range (Dificuldade ⭐⭐)

PYTHON
import pandas as pd

# Número fixo de períodos
print(pd.date_range('2024-01-01', periods=5, freq='D'))
# 2024-01-01 a 2024-01-05

# Início + Fim
print(pd.date_range('2024-01-01', '2024-01-10', freq='2D'))
# 2024-01-01, 2024-01-03, 2024-01-05, 2024-01-07, 2024-01-09

# Apenas dias úteis
bdays = pd.bdate_range('2024-01-01', periods=5)  # ignora fins de semana
print(bdays)

# Frequência mensal
months = pd.date_range('2024-01', periods=4, freq='MS')  # Início do Mês
print(months)

# Por hora
hours = pd.date_range('2024-01-15 09:00', periods=4, freq='h')
print(hours)
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeramente dependendo da versão do pandas.

(2) Referência Rápida de Aliases de Frequência

Alias Significado Exemplo
D Dia do calendário Todos os dias
B Dia útil Ignora fins de semana
W Semanal Todo domingo
MS Início do mês 1º dia de cada mês
M Fim do mês Último dia de cada mês
QS Início do trimestre Primeiro dia de cada trimestre
Q Fim do trimestre Último dia de cada trimestre
H Por hora A cada hora
T/min Por minuto A cada minuto

8. Exemplo Completo: Análise de Séries Temporais de uma Cafeteria

(5) ▶ Sistema de Tipos de Data e Hora

100%
graph LR
    A[Tipos de Datetime do Pandas] --> B[Timestamp - Ponto no Tempo]
    A --> C[DatetimeIndex - Série Temporal]
    A --> D[Tedelta - Duração]
    A --> E[Período - Intervalo de Tempo]
    B --> F[Momento único]
    C --> G[Agregação por frequência]
    D --> H[Aritmética de datas]
    E --> I[Agregação mensal/trimestral]
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente local Python (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente local Python (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Fluxo de trabalho completo de análise de séries temporais (Dificuldade ⭐⭐⭐)

PYTHON
import pandas as pd
import numpy as np

# ============================================
# Exemplo abrangente: análise de séries temporais
# de cafeteria com operações de datetime
# ============================================

# 1. Criar dados de vendas diárias para 90 dias
np.random.seed(42)
df = pd.DataFrame({
    'date': pd.date_range('2024-01-01', periods=90, freq='D'),
    'sales': np.random.poisson(50, 90) * 10,
    'customers': np.random.poisson(30, 90)
})
df = df.set_index('date')

# 2. Extrair características de tempo
df['month'] = df.index.month
df['day_of_week'] = df.index.dayofweek
df['day_name'] = df.index.day_name()
df['is_weekend'] = df.index.dayofweek >= 5
df['week_number'] = df.index.isocalendar().week.astype(int)

# 3. Resumo mensal
monthly = df.groupby('month').agg(
    total_sales=('sales', 'sum'),
    avg_customers=('customers', 'mean'),
    days=('sales', 'count')
).round(0)
print("=== Resumo Mensal ===")
print(monthly)

# 4. Dia da semana vs Fim de semana
wknd = df.groupby('is_weekend')['sales'].mean().round(0)
print(f"\n=== Dia da Semana vs Fim de Semana ===\n{wknd}")

# 5. Melhor dia da semana
best_day = df.groupby('day_name')['sales'].mean().sort_values(ascending=False)
print(f"\n=== Melhor Dia ===\n{best_day.head(3)}")

# 6. Crescimento mês a mês
monthly_sales = df.resample('M')['sales'].sum()
mom_growth = monthly_sales.pct_change().round(3) * 100
print(f"\n=== Crescimento Mês a Mês % ===\n{mom_growth}")
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente local Python (pandas 2.x). O servidor Piston não tem o pandas pré-instalado. Por favor, instale-o localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

❓ Perguntas Frequentes

P Como especifico o formato para to_datetime?
R O formato ISO (2024-01-15) é detectado automaticamente, então nenhum parâmetro de formato é necessário. Para formatos não padrão, use o parâmetro format: pd.to_datetime(s, format='%d/%m/%Y'). Códigos de formato strftime do Python: %Y para ano, %m para mês, %d para dia, %H para hora, %M para minuto, %S para segundo. Especificar o formato é 5-10 vezes mais rápido que a detecção automática.
P .dt é semelhante a .str?
R Sim — .str é o acessor de strings e .dt é o acessor de datetime. Ambos usam a sintaxe .accessor.método(), ambos pulam automaticamente valores NaN/NaT, e ambos suportam encadeamento de métodos. .str opera em colunas de string enquanto .dt opera em colunas de datetime.
P Quais operações o Timedelta suporta?
R Timestamp ± Timedelta = Timestamp (adição/subtração de datas). Timestamp - Timestamp = Timedelta (diferença de datas). Timedelta ± Timedelta = Timedelta (adição/subtração de duração). Timedelta × int = Timedelta (multiplicação de duração). Timedelta + Timedelta = Timestamp não é suportado (seria sem sentido).
P Qual é a diferença entre a frequência D e B?
R D = dia calendário (inclui fins de semana), B = dia útil (pula fins de semana). date_range(freq='D') gera todos os dias, enquanto bdate_range() ou freq='B' gera apenas dias úteis. Para frequência mensal, MS = início do mês, M = fim do mês. Escolher a frequência errada pode levar a resultados de resample muito diferentes.
P Como faço para lidar com fusos horários?
R Use tz_localize para definir um fuso horário e tz_convert para converter entre fusos horários: df.index.tz_localize('UTC').tz_convert('Asia/Shanghai'). Pandas usa as bibliotecas de fusos horários pytz/dateutil. Um fluxo de trabalho comum: ler timestamps UTC → converter para o fuso horário local → agregar por data local.
P O que é NaT?
R NaT (Not a Time) é o valor ausente para tipos datetime, equivalente a NaN. pd.to_datetime(errors='coerce') converte datas inválidas para NaT. Qualquer operação envolvendo NaT produz NaT (semelhante a NaN). Use pd.isna() / pd.notna() para detectá-lo.
P Qual é a diferença entre Period e Timestamp?
R Timestamp é um ponto no tempo (2024-01-15 10:30:00), enquanto Period é um intervalo de tempo (janeiro de 2024). Period tem atributos start_time e end_time. Use Period para relatórios mensais/trimestrais e Timestamp para timestamps de eventos. resample produz objetos Period, enquanto rolling requer Timestamp.

📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Crie uma Series contendo strings de data, analise-a com to_datetime, extraia mês e dia da semana (month e dayofweek), e conte o número de registros por mês.
  2. Intermediário (Dificuldade ⭐⭐): Crie um DataFrame de vendas diárias de 30 dias (com DatetimeIndex), use dt para extrair is_weekend, compare as vendas médias entre dias da semana e fins de semana, e calcule um Timedelta para descobrir há quanto tempo ocorreu o dia com as maiores vendas.
  3. Desafio (Dificuldade ⭐⭐⭐): Simule dados de vendas de uma cafeteria durante 90 dias e complete o seguinte: análise com to_datetime → set_index → extração via dt de mês/trimestre/dia da semana → resumo mensal com groupby → cálculo da taxa de crescimento mês a mês → descubra o dia da semana com melhor desempenho.

← Previous: String Operations · Next: Advanced Time Series →

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%