如何对DataFrame中两个日期列相减计算得到月份差值
实现Pandas两日期列的月份差计算
前置处理:转换日期列格式
首先需将存储日期的两列转换为pandas的datetime类型,避免字符串运算报错:
import pandas as pd # 示例DataFrame,替换为你自己的数据源即可 df = pd.DataFrame({ 'start_date': ['2019-05-01', '2020-02-01', '2021-11-01'], 'end_date': ['2019-09-01', '2020-05-01', '2022-01-01'] }) # 批量转日期格式 df[['start_date', 'end_date']] = df[['start_date', 'end_date']].apply(pd.to_datetime)
计算自然月差值(匹配你的需求)
你需要的同跨度自然月计数(如2019-09-01减2019-05-01得到4),推荐以下两种稳定方案:
- 方案1:使用
Period对象相减(适配整月对齐场景,代码最简洁)
df['month_diff'] = (df['end_date'].dt.to_period('M') - df['start_date'].dt.to_period('M')).apply(lambda x: x.n)
运算后你的示例数据会直接返回4,完全符合预期。
- 方案2:手动拼接年月差值(适配非整月对齐的自然月统计)
df['month_diff'] = (df['end_date'].dt.year - df['start_date'].dt.year) * 12 + (df['end_date'].dt.month - df['start_date'].dt.month)
逻辑为按公历年月差直接计算,结果和方案1完全一致。
其他场景补充
如果你的日期不是月初对齐,需要按实际满30天近似计算月份差,可以使用天数取整方案:
df['month_diff'] = (df['end_date'] - df['start_date']).dt.days // 30
该方案为近似值,会受当月实际天数影响,仅适合不需要严格自然月统计的场景。
内容的提问来源于stack exchange,提问作者Adam_Gie
相关产品推荐
相关产品推荐

