如何让strftime周数与Pandas时间序列周频率匹配?
解决动态适配起止周的补全问题
这个问题我之前也踩过坑!核心是pd.date_range默认的周锚点和你原数据中YW列的周定义没对齐,导致首尾周偏移。咱们换个思路,用Period序列来生成完整周,完美适配原数据的起止周:
步骤1:确认原数据的周定义
首先先验证你的YW列和Date列的对应关系是否符合%Y/%U(周日为一周起始)的规则:
import pandas as pd # 把Date列转成datetime类型 df['Date'] = pd.to_datetime(df['Date']) # 生成校验用的YW列,和原YW对比 df['verify_YW'] = df['Date'].dt.strftime('%Y/%U')
如果verify_YW和原YW完全一致,说明你的周定义确实是周日作为一周第一天(对应%U规则),接下来就可以用这个规则生成完整周序列。
步骤2:生成完整的周Period序列
用pd.period_range直接按周周期生成,它会自动识别每个日期所在的完整周,不会出现偏移:
# 获取原数据中最小/最大日期对应的周Period(W-SUN表示周日为周起始) min_week = df['Date'].min().to_period('W-SUN') max_week = df['Date'].max().to_period('W-SUN') # 生成从起始周到结束周的连续周序列 full_week_periods = pd.period_range(start=min_week, end=max_week, freq='W-SUN') # 把Period序列转成你需要的'%Y/%U'格式 full_yw = full_week_periods.strftime('%Y/%U')
这里的W-SUN对应%U的周规则,如果你的YW是按周一为起始(对应%W),只需要把freq改成'W-MON'就行。
步骤3:合并原数据并补全缺失值
把原数据的YW设为索引,重新索引到完整的full_yw序列,缺失的Count自动填充为0:
# 原数据设置YW为索引 df.set_index('YW', inplace=True) # 重新索引,填充缺失的Count为0 df_full = df.reindex(full_yw, fill_value=0) # 重置索引,恢复YW列 df_full.reset_index(inplace=True) df_full.rename(columns={'index': 'YW'}, inplace=True) # (可选)重新生成连续的Value列 df_full['Value'] = range(len(df_full))
为什么这个方法能解决问题?
pd.period_range是基于周期生成的,它会直接把你的起始日期映射到对应的完整周,而不是像date_range那样从起始日期往后找下一个周锚点(比如周日)。- 不管你的起始/结束日期是周内的哪一天(比如原数据起始是周六),它都能准确包含对应的周,不会出现首尾周缺失或偏移的问题。
测试一下的话,生成的full_yw第一个值就是2017/19,最后一个是2020/09,完美匹配你原数据的起止周,中间所有缺失的周也都会被补全,Count自动设为0。
内容的提问来源于stack exchange,提问作者MattSom
相关产品推荐
相关产品推荐

