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

如何按周过滤日期列?提取每周首日数据遇问题求助

解决按周过滤保留每周首日的问题

你当前代码存在两个核心问题:

  • pd.date_range(freq='W')默认生成的是每周日的日期,并非每周首日(通常指周一),且匹配逻辑不符合需求
  • df1[weeks]是错误的索引方式,你试图用日期值作为列名取数据,但DataFrame只有Date列,自然返回空值

以下是几种可行的解决方案:

方法1:按周分组取每组首个日期

利用dt.isocalendar()提取年份和周数,分组后保留每组第一行:

import pandas as pd

df1 = pd.DataFrame({"Date":pd.date_range(start='1/1/2018', end='31/12/2019')})
# 提取年份+周数作为唯一分组标识
df1['year_week'] = df1['Date'].dt.isocalendar().year.astype(str) + '-' + df1['Date'].dt.isocalendar().week.astype(str)
# 分组取每组第一行
weekly_first_day = df1.groupby('year_week').first().reset_index(drop=True)
print(weekly_first_day)

方法2:用resample按周聚合

将Date设为索引后,通过resample指定周周期规则,直接提取每周首日:

df1 = pd.DataFrame({"Date":pd.date_range(start='1/1/2018', end='31/12/2019')})
# 将日期列设为索引
df1.set_index('Date', inplace=True)
# 按周(周一为一周起始)重采样,取每组第一个日期
weekly_first_day = df1.resample('W-MON').first().reset_index()
print(weekly_first_day)

注:W-MON表示以周一作为周周期的结束,会返回每周的第一个日期;若你定义的首日是周日,可改用W-SUN,其他日期同理。

方法3:生成每周首日序列后过滤

先生成符合要求的每周首日列表,再用isin过滤原DataFrame:

df1 = pd.DataFrame({"Date":pd.date_range(start='1/1/2018', end='31/12/2019')})
# 生成每周一的日期序列(通过减6天得到周一作为首日)
weekly_starts = pd.date_range(start=df1['Date'].min(), end=df1['Date'].max(), freq='W-MON') - pd.Timedelta(days=6)
# 过滤出匹配的日期行
weekly_first_day = df1[df1['Date'].isin(weekly_starts)]
print(weekly_first_day)

内容的提问来源于stack exchange,提问作者Yonko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:46:06