You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Pandas DataFrame对应年月的最大天数并优化运行效率?

优化Pandas计算年月最大天数的效率问题

原始数据与需求

我们有如下Pandas DataFrame:

import pandas as pd

df = pd.DataFrame({'ID': [1,2,3,4],
                   'month': [12, 2, 8, 6],
                   'year': [2021, 2022, 2022, 2020]})

输出结果:

ID  month  year
0   1     12  2021
1   2      2  2022
2   3      8  2022
3   4      6  2020

需要为该DataFrame新增Max_day列,存储每行对应年月的最大天数。

原始低效实现

最初使用循环逐行计算的代码如下,虽然能得到正确结果,但数据量大时运行耗时极长:

df['Max_day'] = 0

for i in range(0,len(df)):
    v_month = df['month'].loc[i]
    v_year = df['year'].loc[i]

    df['Max_day'].loc[i] = pd.Period(v_year.astype(str) + "-" + 
                                     v_month.astype(str)).days_in_month

正确输出结果:

ID  month  year  Max_day
0   1     12  2021       31
1   2      2  2022       28
2   3      8  2022       31
3   4      6  2020       30

高效优化方案

Pandas的核心优势是向量化操作,完全可以避免逐行循环,以下两种方法能大幅提升效率:

方法1:利用pd.to_datetime提取月天数

通过构造年月字符串转为datetime类型,直接调用dt.days_in_month属性获取每月最大天数:

df['Max_day'] = pd.to_datetime(
    df['year'].astype(str) + '-' + df['month'].astype(str),
    format='%Y-%m'
).dt.days_in_month

方法2:直接构造PeriodIndex

使用PeriodIndex直接批量创建年月周期对象,再提取days_in_month:

df['Max_day'] = pd.PeriodIndex(
    year=df['year'], 
    month=df['month'], 
    freq='M'
).days_in_month

优化原理

循环逐行处理时,每次loc索引查找和单个Period对象创建都会带来额外开销;而向量化操作是底层基于C语言的批量处理,能一次性完成所有行的计算,效率提升非常显著(数据量越大,差距越明显)。


内容的提问来源于stack exchange,提问作者valentim.kodak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:10:36