如何基于指定非规则日期对Pandas时间序列重采样求和?
解决方案
针对你要按指定日期对月度Pandas Series做累加重采样的需求,这里有两种实用方法,分别适配规则频率和任意非规则日期的场景:
方法一:利用resample处理规则频率(推荐)
因为你的dates正好是每两个月的月末(频率为2M),直接用Pandas的resample就能快速实现需求,只需调整标签和闭合方式来匹配期望结果:
import pandas as pd # 初始化数据(你的代码示例) date_index = pd.date_range("2010-01-31", "2010-12-31", freq="M") df = pd.Series(range(12), index=date_index) dates = date_index[1::2] # 重采样并求和 result = df.resample('2M', label='right', closed='right').sum() print(result)
输出结果:
2010-02-28 1 2010-04-30 5 2010-06-30 9 2010-08-31 13 2010-10-31 17 2010-12-31 21 Freq: 2M, dtype: int64
参数说明:
'2M':指定每两个月为一个采样周期label='right':用每个周期的结束日期(也就是你给定的dates)作为结果的索引标签closed='right':每个周期包含右侧的边界日期,确保每个周期的最后一个月数据被纳入求和范围
方法二:通用分组处理任意非规则日期
如果你的dates是完全无规律的(比如不是固定间隔的日期),可以用pd.cut把原数据的索引按dates划分区间,再分组求和,完全适配任意指定日期:
import pandas as pd # 初始化数据 date_index = pd.date_range("2010-01-31", "2010-12-31", freq="M") df = pd.Series(range(12), index=date_index) dates = date_index[1::2] # 划分区间并分组求和 # 注意:要在bins开头加一个比最早数据日期更早的时间,确保第一个区间能包含所有前置数据 bins = [df.index.min() - pd.Timedelta(days=1)] + list(dates) result = df.groupby(pd.cut(df.index, bins=bins, include_lowest=True)).sum() # 把分组后的索引替换成你指定的dates result.index = dates print(result)
输出结果和方法一完全一致,这种方法不受日期频率限制,不管你的dates是规则还是不规则都能用。
两种方法得到的结果都完美匹配你期望的输出,每个日期对应的数值都是该日期所在时间段内所有月度数据的累加和。
内容的提问来源于stack exchange,提问作者zsljulius
相关产品推荐
相关产品推荐

