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.
1. What You Will Learn
- ❶ Timestamp / DatetimeIndex
- ❷ pd.to_datetime parsing
- ❸ .dt accessor
- ❹ Timedelta arithmetic
- ❺ date_range and frequency
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:
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!
> **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
> **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 ⭐)
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
> **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
> **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 ⭐)
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)
> **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
> **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 ⭐⭐)
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)
> **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
> **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 ⭐⭐)
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']])
> **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
> **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 ⭐)
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
> **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
> **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 ⭐⭐)
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)
> **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
> **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 ⭐⭐)
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)
> **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
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]
> **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
> **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 ⭐⭐⭐)
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}")
> **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
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.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.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.📖 Resumo
- O Pandas possui quatro tipos de data/hora: Timestamp (ponto no tempo) / DatetimeIndex (série temporal) / Timedelta (duração) / Período (intervalo de tempo)
- pd.to_datetime interpreta strings de data; o parâmetro format especifica o formato; errors='coerce' lida com valores inválidos de maneira suave
- O acessador .dt extrai propriedades de data/hora (year/month/day/hour/dayofweek/quarter, etc.)
- Timedelta suporta adição e subtração de datas; pd.to_timedelta cria durações a partir de strings ou números
- date_range gera sequências de datas com aliases de frequência D/B/W/MS/QS/Q/H
- DatetimeIndex como índice permite a análise de séries temporais (resample/shift/rolling)
- Use bdate_range ou freq='B' para dias úteis; use tz_localize/tz_convert para fusos horários
📝 Exercícios
- 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.
- 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.
- 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 →