Pandas如何筛选数据集最后5周对应的数据值
问题根源
你原代码无法运行的核心原因有3个:
dt.week返回的是整数类型的年内周编号(取值范围1-53),和timedelta时间差对象类型不匹配,直接做减法会触发类型错误。- 仅用周数做差没有处理跨年场景:如果数据集最新时间是新年第2周,周数减5会得到负数,无法匹配上一年年末的周数据,逻辑完全失效。
nlargest(5, 列名)的作用是返回指定列值最大的5行记录,不是返回最近5个周的全量数据,不符合需求。
实现方案
根据需求场景二选一即可:
方案1:取数据集中实际存在的最近5个自然周全量数据
这个方案会自动跳过数据中缺失的周,精准命中数据里最新的5个有记录的自然周,同时自动处理跨年问题,是最通用的实现:
# 生成ISO标准的年、周标识,避免跨年周数重复冲突 gdf_hpo['iso_year'] = gdf_hpo[DATE].dt.isocalendar().year gdf_hpo['iso_week'] = gdf_hpo[DATE].dt.isocalendar().week # 提取数据中按时间倒序排列的前5个唯一(年,周)组合 last_5_weeks = gdf_hpo[['iso_year', 'iso_week']] .drop_duplicates() .sort_values(by=['iso_year', 'iso_week'], ascending=False) .head(5) # 关联筛选出对应周的所有行 gdf_last_5weeks = gdf_hpo.merge(last_5_weeks, on=['iso_year', 'iso_week'], how='inner')
方案2:取最新日期往前推5周时间窗口内的所有数据
如果你的需求是「以数据集最新日期为终点,取往前35天范围内的所有记录」,不需要对齐自然周边界,可以直接用时间范围筛选,代码更简洁:
# 获取数据集最新时间 max_date = gdf_hpo[DATE].max() # 筛选时间在[最新日期-5周, 最新日期]区间的所有记录 gdf_last_5weeks = gdf_hpo[gdf_hpo[DATE] >= max_date - pd.Timedelta(weeks=5)]
补充:如果需要对齐自然周边界计算窗口(比如最新日期是周中,要从最近一个完整周的周一开始算5周范围),可以先把最新日期对齐到周起点再计算,以周一为周起点的对齐代码为:
max_date = gdf_hpo[DATE].max().to_period('W').start_time
内容的提问来源于stack exchange,提问作者Thomas Rivière
相关产品推荐
相关产品推荐

