如何在保留W-SUN频率的前提下为Pandas Period Series减一年?
问题描述
我有一个Pandas Series,其数据类型为Period对象,频率为W-SUN:
>>> dft_history.date dtype: period[W-SUN]
我希望保留该频率,同时筛选出自当前时间起过去一年的数据。尝试为这些Period减去一年时出现错误:
>>> dft_history.date - pd.DateOffset(years=1) IncompatibleFrequency: Input has different freq=<-1 * DateOffset: years=1> from PeriodArray(freq=W-SUN)
尝试为pd.DateOffset设置其他时间频率,但仍未解决问题。请问是否有办法在保留W-SUN频率的前提下实现需求?
解决方案
Period对象依赖固定频率,直接用DateOffset会因频率不匹配报错,可通过以下两种方式实现需求:
方法一:基于时间戳转换计算精确边界
- 先获取当前时间对应的W-SUN周期,再用
relativedelta计算一年前的时间戳,最后转成同频率的Period:import pandas as pd from dateutil.relativedelta import relativedelta # 获取当前周(W-SUN)的Period对象 current_period = pd.Period.now(freq='W-SUN') # 计算一年前的时间,再转成W-SUN周期 one_year_ago_time = current_period.start_time - relativedelta(years=1) one_year_ago_period = pd.Period(one_year_ago_time, freq='W-SUN') - 直接用Period的比较操作筛选数据,全程保留原W-SUN频率:
filtered_data = dft_history[dft_history.date >= one_year_ago_period]
方法二:基于周数偏移近似计算
如果不需要极致精确,可直接对Period进行周数偏移(一年近似52周):
current_period = pd.Period.now(freq='W-SUN') # 向后偏移52周得到一年前的周期 one_year_ago_period = current_period.shift(-52) filtered_data = dft_history[dft_history.date >= one_year_ago_period]
说明:方法一考虑了闰年、不同年份周数差异等情况,精度更高;方法二更简洁,适合对精度要求不高的场景。
内容的提问来源于stack exchange,提问作者Fernando Jesus Garcia Hipola
相关产品推荐
相关产品推荐

