如何在Pandas中按月份分组统计小时级数据的空值时长?
解决方案
原代码问题分析
你的代码存在两个核心问题:
groupby传入多个分组键时必须放在列表中,直接用逗号分隔会被识别为其他参数,导致分组逻辑错误。count()统计的是非空值的数量,和你需要的“空值小时数”需求完全相反。
针对不同需求的实现代码
需求1:统计每个日历月份(1-12)的总空值小时数(所有年份同月份汇总)
# 标记空值并按月份分组求和 gap_in_month = OG_1998_2022_gaps['rel_humidity'].isna().groupby(OG_1998_2022_gaps.index.month).sum() # 转换为DataFrame并设置列名 gap_in_month = gap_in_month.to_frame(name='null_hours')
执行后得到的DataFrame索引为1-12的月份数字,null_hours列对应该月份的累计空值小时数。
需求2:统计每个年月(如1998-01、1998-02)的空值小时数
推荐两种实现方式:
方式一:按年份+月份分组
# 按年、月分组统计空值数 gap_in_month = OG_1998_2022_gaps['rel_humidity'].isna().groupby( [OG_1998_2022_gaps.index.year, OG_1998_2022_gaps.index.month] ).sum() # 将多级索引转为"年-月"格式 gap_in_month.index = gap_in_month.index.map(lambda x: f"{x[0]}-{x[1]:02d}") # 转换为DataFrame gap_in_month = gap_in_month.to_frame(name='null_hours')
方式二:直接使用周期索引(更简洁)
# 将时间索引转为月份周期,再分组求和 gap_in_month = OG_1998_2022_gaps['rel_humidity'].isna().groupby( OG_1998_2022_gaps.index.to_period('M') ).sum().to_frame(name='null_hours')
这种方式的索引是Period类型,格式为YYYY-MM,可以直接用于时间序列分析。
内容的提问来源于stack exchange,提问作者user9667136
相关产品推荐
相关产品推荐

