Python-pandas-时间序列

Python-pandas-时间序列
Pandas 时间序列Pandas 拥有强大的时间序列处理能力涵盖日期解析、重采样、滚动窗口、时区处理等。 日期时间类型pd.Timestamp— 单个时间点importpandasaspdimportnumpyasnp# 创建 Timestamptspd.Timestamp(2024-07-15)tspd.Timestamp(2024-07-15 14:30:00)tspd.Timestamp(2024-07-15 14:30:0008:00)# 带时区tspd.Timestamp.now()# 当前时间tspd.Timestamp.now(tzAsia/Shanghai)tspd.Timestamp(year2024,month7,day15,hour14,minute30)# Timestamp 属性print(ts.year)# 2024print(ts.month)# 7print(ts.day)# 15print(ts.hour)# 14print(ts.minute)# 30print(ts.second)# 0print(ts.dayofweek)# 0 (周一0, 周日6)print(ts.dayofyear)# 197print(ts.quarter)# 3print(ts.week)# 29print(ts.days_in_month)# 31print(ts.is_leap_year)# True (2024 是闰年)pd.DatetimeIndex— 时间索引# 从字符串列表创建datespd.DatetimeIndex([2024-01-01,2024-01-02,2024-01-03])# pd.date_range() — 生成日期范围 ⭐datespd.date_range(start2024-01-01,end2024-12-31,freqD)# 每天datespd.date_range(start2024-01-01,periods12,freqMS)# 每月初12 期datespd.date_range(start2024-01-01,periods8,freqQ)# 每季末8 期datespd.date_range(start2024-01-01,periods52,freqW-MON)# 每周一datespd.date_range(start2024-01-01,periods5,freqB)# 工作日datespd.date_range(start2024-01-01 09:00,periods8,freqh)# 每小时datespd.date_range(start2024-01-01,periods96,freq15min)# 每 15 分钟# 常用频率别名# D 日历日 B 工作日 W 周日结束的周# M 月末 MS 月初 Q 季末# QS 季初 Y 年末 YS 年初# h 小时 min 分钟 s 秒# W-MON 周一结束 BMS 月初工作日pd.Timedelta— 时间差# 创建 Timedeltadeltapd.Timedelta(days1)deltapd.Timedelta(1 day)deltapd.Timedelta(2 days 3 hours 30 minutes)deltapd.Timedelta(1W)# 1 周deltapd.Timedelta(3D 5h)# 3 天 5 小时# 时间运算tspd.Timestamp(2024-07-15)print(tspd.Timedelta(days7))# 2024-07-22print(ts-pd.Timedelta(weeks2))# 2024-07-01print(tspd.Timedelta(hours48))# 2024-07-17 00:00:00 解析与转换pd.to_datetime()— 字符串转时间# 基本转换spd.Series([2024-01-01,2024-01-02,invalid,2024-01-04])datespd.to_datetime(s,errorscoerce)# 无效值 - NaT# errors 选项# raise: 遇到无效值报错默认# coerce: 无效值转为 NaT# ignore: 无效值保持原样# 指定格式加速解析datespd.to_datetime(s,format%Y-%m-%d)# 常用格式码# %Y 四位年份 %y 两位年份 %m 月份(01-12)# %d 日期(01-31) %H 时(00-23) %M 分(00-59)# %S 秒(00-59) %f 微秒 %z UTC偏移# %b 英文缩写月份 %A 星期全称 %a 星期缩写# 推断格式datespd.to_datetime(s,infer_datetime_formatTrue)# 自动推断 以时间为索引的 DataFrame# 创建时间索引datespd.date_range(2024-01-01,periods365,freqD)dfpd.DataFrame({sales:np.random.randn(365).cumsum()100,visitors:np.random.randint(100,500,365)np.arange(365)},indexdates)# 按时间切片df[2024-01]# 2024 年 1 月所有数据df[2024-01-15]# 1 月 15 日df[2024-01:2024-03]# 1 月到 3 月df[2024-01-15:2024-02-15]# 跨时间段# 时间属性访问df[year]df.index.year df[month]df.index.month df[day]df.index.day df[weekday]df.index.weekday# 周一0df[quarter]df.index.quarter df[day_name]df.index.day_name()# Monday, Tuesday...df[is_month_start]df.index.is_month_start df[is_quarter_end]df.index.is_quarter_endbetween_time()— 按时间段筛选# 创建带时间戳的数据idxpd.date_range(2024-01-01,periods96,freq15min)tspd.Series(range(96),indexidx)# 筛选 09:00 - 17:00 的数据ts.between_time(09:00,17:00)# 筛选非工作时间ts.between_time(17:00,09:00,include_startFalse) 重采样resample()⭐将时间序列从一种频率转换到另一种频率。datespd.date_range(2024-01-01,periods365,freqD)dfpd.DataFrame({value:np.random.randn(365).cumsum()},indexdates)# 降采样: 日 - 月monthlydf.resample(M)[value].mean()# 月均值monthlydf.resample(M)[value].sum()# 月总和monthlydf.resample(M)[value].last()# 月末值monthlydf.resample(M)[value].first()# 月初值monthlydf.resample(M)[value].ohlc()# open/high/low/close# 升采样: 日 - 小时需要填充hourlydf.resample(h).ffill()# 前向填充hourlydf.resample(h).bfill()# 后向填充hourlydf.resample(h).interpolate()# 插值hourlydf.resample(h).asfreq()# 不填充NaN# 多列聚合resultdf.resample(W).agg({sales:sum,visitors:mean})# 自定义聚合resultdf.resample(M).apply(lambdax:x.max()-x.min())resample常用频率频率含义频率含义D日历日W周周日结束M月末MS月初Q季末QS季初Y/A年末YS/AS年初h/H小时min/T分钟W-MON周一结束B工作日SM半月15日月末BM工作月末Q-DEC12月结束的季BQ工作季末 滚动窗口rolling()dfpd.DataFrame({price:np.random.randn(252).cumsum()100},indexpd.date_range(2024-01-01,periods252,freqB))# 简单移动平均df[SMA_7]df[price].rolling(window7).mean()df[SMA_30]df[price].rolling(window30).mean()# 其他滚动统计df[rolling_std]df[price].rolling(7).std()# 滚动标准差df[rolling_min]df[price].rolling(7).min()# 滚动最小值df[rolling_max]df[price].rolling(7).max()# 滚动最大值df[rolling_sum]df[price].rolling(7).sum()# 滚动求和df[rolling_median]df[price].rolling(7).median()# 滚动中位数df[rolling_quantile]df[price].rolling(30).quantile(0.9)# 滚动分位数df[rolling_skew]df[price].rolling(30).skew()# 滚动偏度df[rolling_corr]df[price].rolling(30).corr(df[price].shift())# 滚动相关# 自定义滚动函数df[rolling_range]df[price].rolling(7).apply(lambdax:x.max()-x.min())# rolling 参数# window: 窗口大小int 或 offset 如 7D# min_periods: 最少非空观测数# center: 标签是否居中默认 False# win_type: 窗口类型 (如 gaussian, triang)# closed: 区间闭合方式 (right/left/both/neither)时间偏移窗口# 按时间而非行数的滚动窗口索引必须是 DatetimeIndexdf[rolling_7d]df[price].rolling(window7D).mean()# 支持的时间窗口df[price].rolling(window3D).mean()df[price].rolling(window2h).mean()df[price].rolling(window30min).mean()expanding()— 扩展窗口从序列开始累积到当前窗口越来越大。# 累积统计df[expanding_mean]df[price].expanding().mean()df[expanding_std]df[price].expanding().std()df[expanding_max]df[price].expanding().max()# 最小观测数df[expanding_mean_min10]df[price].expanding(min_periods10).mean()⚖️ewm()— 指数加权# 指数加权移动平均df[ewm_alpha]df[price].ewm(alpha0.3).mean()# 平滑因子 αdf[ewm_span]df[price].ewm(span7).mean()# 跨度相当于 7 天 SMAdf[ewm_halflife]df[price].ewm(halflife3).mean()# 半衰期df[ewm_com]df[price].ewm(com3.5).mean()# 质心# 其他 ewm 统计df[ewm_std]df[price].ewm(span7).std()df[ewm_var]df[price].ewm(span7).var()df[ewm_corr]df[price].ewm(span7).corr(df[price].shift())shift()/diff()/pct_change()# shift: 平移df[price_lag1]df[price].shift(1)# 前移 1 期df[price_lead1]df[price].shift(-1)# 后移 1 期df[price_lag7]df[price].shift(7)# 前移 7 期# 按频率平移索引必须是 DatetimeIndexdf[price_1m_ago]df[price].shift(periods1,freqM)# diff: 差分df[price_diff]df[price].diff()# 一阶差分df[price_diff2]df[price].diff(2)# 二阶差分# pct_change: 变化率df[returns]df[price].pct_change()# 日变化率df[weekly_return]df[price].pct_change(periods5)# 周变化率 时区处理# 本地化时区tspd.Timestamp(2024-07-15 14:30:00)ts_beijingts.tz_localize(Asia/Shanghai)# Timestamp(2024-07-15 14:30:000800)# 时区转换ts_nyts_beijing.tz_convert(America/New_York)# Timestamp(2024-07-15 02:30:00-0400)# DataFrame 时区操作idxpd.date_range(2024-01-01,periods10,freqD)dfpd.DataFrame({val:range(10)},indexidx)dfdf.tz_localize(Asia/Shanghai)# 添加时区dfdf.tz_convert(UTC)# 转时区dfdf.tz_localize(None)# 移除时区不转换时间# 常用时区# Asia/Shanghai 中国标准时间 (UTC8)# Asia/Tokyo 日本标准时间 (UTC9)# America/New_York 美东 (UTC-5/-4)# Europe/London 英国 (UTC0/1)# UTC / Etc/GMT 世界协调时 时间偏移pd.DateOffsetfrompandas.tseries.offsetsimportDay,MonthEnd,YearEnd,BDay tspd.Timestamp(2024-07-15)print(tsDay(1))# 2024-07-16print(tsMonthEnd())# 2024-07-31print(tsBDay(5))# 5 个工作日后的日期print(tspd.DateOffset(months3))# 3 个月后print(tspd.DateOffset(years1,days-1))# 一年差一天# 生成偏移序列frompandas.tseries.offsetsimportMonthEnd pd.date_range(2024-01-31,periods12,freqMonthEnd())[[pandas2-总览|← 返回总览]]