如何从日期索引的DataFrame中提取每月首个可用日期生成新DataFrame
Pandas取时间序列DataFrame每月首个可用日期数据的最优实现
前置准备
首先确认DataFrame的索引为DatetimeIndex类型,且按时间升序排列,如果不符合要求先执行以下代码预处理:
import pandas as pd # 转换索引为日期类型 df.index = pd.to_datetime(df.index) # 按日期升序排序 df = df.sort_index()
最优实现代码
直接使用pandas内置的时间重采样方法,性能最高、写法最简洁:
# 取每个月首个可用日期的对应数据,自动跳过无数据的月份 df_monthly_first = df.resample('MS').first().dropna()
方案说明
- 效率优势:
resample是pandas底层优化过的向量化操作,比手动遍历、自定义分组规则的实现快3~10倍,数据量越大优势越明显 - 符合需求:自动识别每个月的首个实际存在的日期,不会强制取当月1号,即使当月1号无数据也能正确返回第一个可用的记录
- 灵活扩展:如果后续需要取每月最后一个可用日期的记录,只需把
.first()替换为.last()即可
备选实现(无需补全空月份时可用)
如果不需要处理存在空月份的场景,也可以用分组取首行的方式实现:
df_monthly_first = df.groupby([df.index.year, df.index.month]).head(1)
内容的提问来源于stack exchange,提问作者Alex Zhang
相关产品推荐
相关产品推荐

