如何用Pandas将日度时间序列重采样为月度,取每月首个有效值
解决方法
你的问题出在resample('MS').first()只会取当月第一天的行数据,哪怕当天的DTB6是缺失值,它也不会自动往后查找第一个有效值。要实现“每月首个非缺失值”的需求,可以用以下两种方法:
方法一:先清理缺失值再重采样
先移除DTB6列的缺失行,再对清理后的数据按月份取第一个值:
# 移除DTB6为缺失值的行 df_clean = df.dropna(subset=['DTB6']) # 按每月初重采样,取第一个有效值 monthly_data = df_clean.resample('MS').first()
这种方法简单直接,缺点是如果某个月全是缺失值,该月会直接从结果中消失。
方法二:自定义重采样逻辑(保留所有月份)
如果需要保留所有月份(即使当月无有效值也显示缺失),可以用resample结合自定义lambda函数,专门提取区间内第一个非缺失值:
monthly_data = df.resample('MS').apply( lambda x: x['DTB6'].dropna().iloc[0] if not x['DTB6'].dropna().empty else pd.NA ) # 转成DataFrame格式(如果需要和原结构一致) monthly_data = monthly_data.to_frame('DTB6')
这个逻辑会遍历每个月的区间:
- 先过滤出该月内DTB6的非缺失值
- 如果有有效值就取第一个,没有则返回
pd.NA保留该月份
验证结果
可以用print(monthly_data)查看结果,比如5月1日缺失但2日有值的情况,结果里5月对应的就是2日的DTB6值。
内容的提问来源于stack exchange,提问作者undiv
相关产品推荐
相关产品推荐

