Парсинг дат

df['ts'] = pd.to_datetime(df['ts'])
df['ts'] = pd.to_datetime(df['ts'], format='%Y-%m-%d %H:%M:%S')
df['ts'] = pd.to_datetime(df['ts'], utc=True)

Timezone-aware vs naive

naive = pd.Timestamp('2024-01-15 10:00')
aware = pd.Timestamp('2024-01-15 10:00', tz='Asia/Almaty')

# Это упадёт
naive - aware  # TypeError

# Конвертация
aware_utc = aware.tz_convert('UTC')
naive_almaty = naive.tz_localize('Asia/Almaty')

Извлечение признаков

df['year'] = df['ts'].dt.year
df['month'] = df['ts'].dt.month
df['dow'] = df['ts'].dt.dayofweek
df['hour'] = df['ts'].dt.hour
df['is_weekend'] = df['ts'].dt.dayofweek >= 5

Cyclical encoding для ML

df['hour_sin'] = np.sin(2 * np.pi * df['hour'] / 24)
df['hour_cos'] = np.cos(2 * np.pi * df['hour'] / 24)

Resample для timeseries

df = df.set_index('ts')
daily = df['amount'].resample('D').sum()
weekly = df['amount'].resample('W-MON').sum()
df['ma7'] = df['amount'].rolling(7).mean()

Кейс из Glovo

Аналитик строил retention по часам. Не учёл что UTC + 5 = время Алматы. Пик активности отображался в 17:00 UTC. После tz_convert на Asia/Almaty пик стал в 22:00 — ужин.