如何在 Pandas 中仅对完整月份进行重采样求和(跳过起始/结束不完整的月)
技术百科
花韻仙語
发布时间:2026-01-19
浏览: 次 本文介绍一种精准的 pandas 时间序列处理技巧:使用 `resample('ms')` 结合 `days_in_month` 属性过滤,确保仅对起止日期覆盖整月(即包含该月全部天数)的数据执行月度求和,自动排除首尾不完整的月份。
在实际时间序列分析中,常遇到每日数据跨越多个自然月但不严格对齐月边界的情况(例如从 2025-10-18 开始,到 2025-02-07 结束)。此时若直接使用 df.resample('MS').sum()('MS' 表示 Month Start),Pandas 会将每个日历月的第一天作为分组锚点,并对当月所有可用数据求和——包括仅含部分天数的首月(如 2025-10)和末月(如 2025-02),导致结果不可比、不具统计代表性。
理想方案是:仅保留那些实际数据覆盖了整个月全部天数的月份。核心思路是:对每个重采样后的月份,检查其原始数据记录数是否等于该月应有的总天数(如 2025-02 对应 28 天,2025-02 对应 29 天)。Pandas 的 DatetimeIndex.days_in_month 可直接获取各月天数,而 resample(...).size() 可统计每组有效行数。
以下是完整实现步骤:
import pandas as pd
import numpy as np
# 示例数据:非整月起止的每日数据
df = pd.DataFrame(
{'gas': np.random.uniform(1.5, 6.5, 60)},
index=pd.date_range('2025-10-18', periods=60, freq='D')
)
# 步骤1:按月起始重采样,同时计算每月记录数(size)和求和(sum)
monthly_agg = df.resample('MS').agg({'gas': ['size', 'sum']})
monthly_agg.columns = ['count', 'gas_sum']
# 步骤2:生成对应月份的 DatetimeIndex,并提取各月天数
month_index = monthly_agg.index
days_in_month = month_index.days_in_month
# 步骤3:布尔筛选——仅保留 count 等于该月天数的行
complete_months = monthly_agg[monthly_agg['count'] == days_in_month]
# 步骤4:清理结果:丢弃计数列,保留纯月度求和
result = complete_months[['gas_sum']].rename(columns={'gas_sum': 'gas'})
print(result)✅ 关键说明:
- resample('MS') 确保按标准日历月分组(如 '2025-10-01', '2025-11-01');
- agg({'gas': ['size', 'sum']}) 避免多级列名混乱,显式指定聚合操作;
- month_index.days_in_month 是向量化属性,无需循环,高效可靠;
- 该方法天然兼容闰年、大小月,且不受缺失值影响(size 统计非空行数,若需严格要求每日非空,可改用 count() 并配合 dropna=False 控制)。
⚠️ 注意事项:
- 若原始数据存在某月中断(如缺某几天),即使起止为月初月末,count 也会小于 days_in_month,该月将被自动剔除——这恰是设计所需;
- 不建议使用 df.resample('M').sum()(Month End),因其锚点为月末,可能导致跨月对齐偏差;
- 如需保留原始索引格式(如 PeriodIndex),可在最后用 .set_index(month_index.to_period('M')
) 转换。
通过这一模式,你可确保所有输出月度汇总值均基于完整、可比、无截断的数据窗口,显著提升时序聚合结果的严谨性与业务解释力。
# 这一
# 多个
# 也会
# 所需
# 不受
# 循环
# 行数
# count
# 几天
# pandas
# 原始数据
# 月末
# 首月
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10系统映像怎么恢复 Win10使用系统映像
- C#如何在一个XML文件中查找并替换文本内容
- C++友元类使用场景_C++类间协作设计方式讲解
- Win11怎么设置虚拟内存_Windows 11优
- Windows 10怎么录屏_Windows 10
- Win11怎么设置系统还原_Windows11系统
- Linux怎么修改用户密码_Linux系统pass
- Win11怎么更改文件夹图标_自定义Win11文件
- 手机php怎么转mp4_手机端php文件转mp4a
- Win11如何设置环境变量 Win11添加和修改系
- Win11怎么把图标拖到任务栏_Win11固定应用
- Win10 BitLocker加密教程 Win10
- MAC如何安装Git版本控制工具_MAC开发环境配
- Win11怎么开启专注模式_Windows11时钟
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Windows10如何删除恢复分区_Win10 D
- Win11怎么关闭通知中心_Windows11系统
- Win11怎么查看激活状态_查询Windows 1
- Windows10电脑怎么设置虚拟光驱_Win10
- Win11无法安装软件怎么办_Win11解除应用安
- php中::能访问全局变量吗_全局作用域与类作用域
- Linux如何安装Golang环境_Linux下G
- Win11怎么关闭键盘按键音_Win11禁用打字声
- Python 中将 ISO 8601 时间戳转换为
- php中作用域操作符能访问私有静态属性吗_访问权限
- 如何在 Go 中正确反序列化 XML 多节点数组(
- Windows服务启动类型恢复方法_错误修改导致的
- C#如何序列化对象为XML XmlSerializ
- ACF 教程:如何正确更新嵌套在多层 Group
- LINUX如何查看文件类型_Linux中file命
- Win11怎么关闭自动调节亮度_Windows11
- Win11声音忽大忽小怎么办 Win11音频增强功
- c# 在ASP.NET Core中管理和取消后台任
- Windows系统时间服务错误_W32Time服务
- 如何使用Golang实现Web表单数据绑定_自动映
- Python脚本参数接收_sys与argparse
- 如何快速验证Golang安装是否成功_运行go v
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- Win11怎么制作U盘启动盘_Win11原版系统安
- 如何开启Windows的远程服务器管理工具(RSA
- Win11如何添加/删除输入法 Win11切换中英
- Win11系统占用空间大怎么办 Win11深度瘦身
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- mac怎么安装pip_MAC Python pip
- Win11截图快捷键是什么_Win11自带截图工具
- Python安全爬虫设计_IP代理池与验证码识别策
- Win11怎么关闭自动维护 Win11禁用系统自动
- 如何在 Go 中创建包含映射(map)的切片(sl
- 如何使用Golang处理网络超时错误_Golang
- LINUX的SELinux是什么_详解LINUX强


QQ客服