如何对Pandas DataFrame仅按完整月份重采样求和
过滤非完整月份的月度求和结果
你的需求是:对日度DataFrame按月份求和,但只保留完整月份的数据——也就是排除起始日不是当月1号的第一个月,以及结束日不是当月最后一天的最后一个月。
现有数据示例
原日度数据(已补全日度插值):
gas 2022-10-18 1.81 2022-10-19 2.69 2022-10-20 3.06 2022-10-21 3.10 2022-10-22 2.28 ... ... 2024-02-03 5.68 2024-02-04 5.83 2024-02-05 5.74 2024-02-06 6.55 2024-02-07 3.17
用df.resample('MS').sum()得到的结果包含非完整月份:
2022-10-01 34.040 2022-11-01 164.825 2022-12-01 236.335 2023-01-01 226.180 2023-02-01 197.230 ... ... 2023-10-01 78.060 2023-11-01 191.590 2023-12-01 219.650 2024-01-01 252.370 2024-02-01 38.625
解决方案:通过条目数与当月天数对比过滤
核心思路就是验证每个月的日度条目数是否等于当月实际天数,只保留相等的月份。代码实现如下:
# 1. 按月份分组,同时计算月度求和值和当月条目数 monthly_stats = df.resample('MS').agg( gas_sum=('gas', 'sum'), day_count=('gas', 'count') ) # 2. 获取每个月份的实际天数 monthly_stats['days_in_month'] = monthly_stats.index.days_in_month # 3. 过滤出条目数等于当月天数的完整月份 full_month_sum = monthly_stats[monthly_stats['day_count'] == monthly_stats['days_in_month']]['gas_sum']
运行后得到的full_month_sum就是只包含完整月份的求和结果,会自动排除2022-10和2024-02这种非完整月份。
补充说明
因为你已经通过插值补全了中间月份的日度数据,所以中间月份的day_count肯定等于days_in_month,只会过滤掉首尾的非完整月份,完全符合需求。
内容的提问来源于stack exchange,提问作者monok
相关产品推荐
相关产品推荐

