如何按周过滤日期列?提取每周首日数据遇问题求助
解决按周过滤保留每周首日的问题
你当前代码存在两个核心问题:
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
相关产品推荐
相关产品推荐

