You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保留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会因频率不匹配报错,可通过以下两种方式实现需求:

方法一:基于时间戳转换计算精确边界

  1. 先获取当前时间对应的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')
    
  2. 直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:35:19