如何在Pandas DataFrame中新增列计算月度总值除以当月天数的结果
实现方案
获取月份总天数的方法
Python里获取指定月份天数不需要手动判断大小月、闰年,两种常用方案:
- 批量处理Pandas数据时,直接用Pandas datetime类型自带的
dt.days_in_month属性,自动识别闰年、大小月,直接返回整列每个日期对应月份的总天数,不需要逐行循环,效率最高。 - 单独获取单个月份天数时,用Python标准库
calendar模块的monthrange函数即可,调用格式为calendar.monthrange(年份, 月份)[1],返回值就是对应月份的总天数,比如calendar.monthrange(2020,2)[1]返回29,会自动识别2020是闰年。
DataFrame计算完整流程
针对你给出的样例数据,完整代码如下:
import pandas as pd # 构造样例数据 df = pd.DataFrame({ 'Month': ['Nov. 2019', 'Dec. 2019', 'Jan. 2020', 'Feb. 2020'], 'Total': [45345, 87493, 45765, 38756] }) # 1. 将字符串格式的月份列解析为Pandas datetime类型,默认解析为当月1日 df['temp_month'] = pd.to_datetime(df['Month'], format='%b. %Y') # 2. 计算日均总值:月度总值除以当月天数,结果存入新列 df['Daily Total'] = df['Total'] / df['temp_month'].dt.days_in_month # 3. (可选)删除中间用到的临时解析列 df = df.drop(columns='temp_month')
运行后得到的结果如下,完全符合需求:
Month Total Daily Total 0 Nov. 2019 45345 1511.500000 1 Dec. 2019 87493 2822.354839 2 Jan. 2020 45765 1476.290323 3 Feb. 2020 38756 1336.413793
注意:如果你的月份字符串格式和样例有差异,只需要调整pd.to_datetime里的format匹配规则即可,当前规则里%b匹配英文月份缩写,. 匹配缩写后的点和空格,%Y匹配四位年份。
内容的提问来源于stack exchange,提问作者Robert Tuttle
相关产品推荐
相关产品推荐

