Pandas如何按日/月/年时间频率筛选DataFrame的datetime日期列
Pandas多时间频率数据筛选实现方案
前置处理:标准化日期格式
原始数据日期列为dd/mm/yyyy格式字符串,需先转换为pandas原生datetime类型才能进行时间维度运算,假设日期列名为date、数值列名为value,转换代码如下:
import pandas as pd df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')
各频率筛选实现
日度数据
原始数据本身就是2000-01-01至2010-01-01的连续日度记录,无需额外筛选,直接使用原DataFrame即可。可通过如下代码做数据完整性校验:
daily_df = df.copy() print(f"日度数据范围:{daily_df['date'].min()} ~ {daily_df['date'].max()},总计{len(daily_df)}条记录")
月度数据(保留每月首日记录)
因原始数据为连续日度数据,直接筛选日期为当月1日的记录即可,日期本身已符合“当月1日”的要求,无需额外修改:
# 筛选每月首日记录 monthly_df = df[df['date'].dt.day == 1].copy()
如果需要强制统一日期格式为当月首日(适配非连续数据场景),可追加如下转换代码:
monthly_df['date'] = monthly_df['date'].astype('datetime64[M]')
年度数据(保留每年首日记录)
同理,筛选日期为1月1日的记录即可,日期本身已符合“当年1月1日”的要求:
# 筛选每年1月1日记录 yearly_df = df[(df['date'].dt.month == 1) & (df['date'].dt.day == 1)].copy()
如果需要强制统一日期格式为当年首日(适配非连续数据场景),可追加如下转换代码:
yearly_df['date'] = yearly_df['date'].astype('datetime64[Y]')
兼容方案:如果原始日度数据存在缺失,无法保证每月/每年首日存在对应记录,可使用重采样方法自动对齐日期到周期起点,取每个周期内第一条有效记录:
# 月度重采样,日期自动对齐到当月首日 monthly_df = df.resample('MS', on='date').first().reset_index() # 年度重采样,日期自动对齐到当年1月1日 yearly_df = df.resample('YS', on='date').first().reset_index()上述代码会自动补全所有缺失的时间周期,若不需要空周期可追加
.dropna(subset=['value'])过滤无数据行。
内容的提问来源于stack exchange,提问作者Gabriel Tkacz
相关产品推荐
相关产品推荐

