
Pandas 2.2 时间序列实战3种频率生成与切片处理12个月数据时间序列分析是金融、物联网和商业智能等领域的核心技能。作为Python生态中最强大的数据分析工具Pandas在2.2版本中对时间序列处理进行了多项优化。本文将带您深入掌握date_range的三种频率生成技巧、精确切片方法以及处理跨年度数据的实战经验。1. 时间序列生成基础在Pandas中生成时间序列主要依赖pd.date_range()函数其核心参数包括start: 起始日期字符串或datetime对象end: 结束日期periods: 生成的时间点数量freq: 频率字符串如D天、M月末等生成2021年全年的月末日期金融领域常用场景import pandas as pd # 生成12个月末日期 eom_dates pd.date_range(2021-01-01, periods12, freqM) print(eom_dates)输出结果DatetimeIndex([2021-01-31, 2021-02-28, 2021-03-31, 2021-04-30, 2021-05-31, 2021-06-30, 2021-07-31, 2021-08-31, 2021-09-30, 2021-10-31, 2021-11-30, 2021-12-31], dtypedatetime64[ns], freqM)注意M频率默认生成各月最后一天若需要月初日期应使用MS频率频率参数对照表频率字符串说明典型应用场景D日历日日级交易数据B工作日排除周末的财务分析W周默认周日周报数据汇总W-MON指定周一为周起始国际业务周统计M月末财务报表MS月初月度计划制定Q季末季度业绩报告A年末年度审计2. 三种典型频率实战2.1 月末频率M生成金融领域常用月末数据进行收益率计算import numpy as np # 生成模拟股价数据正态分布 np.random.seed(42) prices np.cumprod(1 np.random.normal(0.01, 0.05, 12)) eom_series pd.Series(prices, indexeom_dates) print(eom_series.head(3))输出示例2021-01-31 1.052542 2021-02-28 1.126678 2021-03-31 1.074932 Freq: M, dtype: float642.2 周频率W生成处理每周销售数据时建议明确指定周起始日# 生成2021年Q1的周数据周一作为起始 weekly_dates pd.date_range(2021-01-01, 2021-03-31, freqW-MON) print(f生成周数: {len(weekly_dates)})输出生成周数: 132.3 日频率D生成处理高频交易数据时需注意节假日# 生成2021年1月工作日数据 bday_dates pd.date_range(2021-01-01, 2021-01-31, freqB) print(f1月工作日天数: {len(bday_dates)})输出1月工作日天数: 213. 高级切片技巧3.1 精确时间范围切片# 创建包含随机值的日级时间序列 daily_data pd.Series( np.random.rand(365), indexpd.date_range(2021-01-01, periods365, freqD) ) # 切片获取Q2数据 q2_data daily_data[2021-04-01:2021-06-30] print(fQ2数据量: {len(q2_data)}条)3.2 部分字符串索引# 获取所有周末数据 weekends daily_data[daily_data.index.weekday 5] print(f周末数据占比: {len(weekends)/len(daily_data):.1%})3.3 基于时间的条件过滤# 获取工作时间数据9:00-17:00 times pd.date_range(2021-01-01 08:00, periods24*60, freqT) minute_data pd.Series(range(len(times)), indextimes) work_hours minute_data.between_time(09:00, 17:00)4. 金融数据处理实战4.1 收益率计算# 计算月收益率 returns eom_series.pct_change().dropna() print(月收益率描述:\n, returns.describe())4.2 滚动窗口计算# 3个月滚动波动率 volatility returns.rolling(3).std() print(滚动波动率:\n, volatility.tail())4.3 重采样处理# 将日数据降采样为周数据 weekly_mean daily_data.resample(W-MON).mean() print(周均值数据:\n, weekly_mean.head(3))5. 常见问题解决方案时区处理# 添加时区信息并转换 tz_aware pd.date_range(2021-01-01, periods3, freqD, tzAsia/Shanghai) print(上海时间:\n, tz_aware.tz_convert(UTC))处理闰年# 生成闰年日期序列 leap_year pd.date_range(2020-02-28, periods4, freqD) print(闰年测试:\n, leap_year)频率别名冲突提示Pandas 2.2中M始终表示月末避免与分钟(min)混淆实际项目中处理电商促销数据时发现使用freq7D生成的周数据比freqW更灵活可以自定义起始日。而金融风控场景中freqBMS每月第一个工作日生成的索引能有效避开节假日对报表的影响。