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

如何在Pandas DataFrame中生成两日期列之间的所有月份?

解决DataFrame中生成日期区间内所有月份的问题

需求说明

需要基于DataFrame的StartDate和EndDate列,生成两日期之间的所有月份,新增Month列并以逗号分隔的形式展示月份数字。

原始DataFrame

StartDateEndDate
01-15-201008-15-2010
07-01-200901-13-2010

期望输出

StartDateEndDateMonth
01-15-201008-15-20101,2,3,4,5,6,7,8
07-01-200901-13-20107,8,9,10,11,12,1

问题代码

用户尝试的代码未达到预期效果:

date_range= lambda x:range (x['StartDate'].month,x['EndDate'].month+1)
df=df.assign(month=df.apply(date_range, axis=1)

问题分析

这段代码存在两个核心问题:

  1. 日期类型未转换:原始的StartDate和EndDate是字符串格式,直接调用.month属性会报错,无法正确获取月份。
  2. 未处理跨年场景:当EndDate的年份晚于StartDate时,比如从2009年7月到2010年1月,range(7,1+1)会返回空序列,完全无法覆盖跨年的月份。

解决方案

步骤1:转换日期列类型

先将字符串格式的日期转换为datetime类型,确保能正确获取年份和月份信息。

步骤2:编写月份生成函数

处理同一年和跨年两种场景,生成完整的月份列表后转为逗号分隔的字符串。

步骤3:应用函数生成目标列

完整代码

import pandas as pd

# 构造原始DataFrame
data = {
    'StartDate': ['01-15-2010', '07-01-2009'],
    'EndDate': ['08-15-2010', '01-13-2010']
}
df = pd.DataFrame(data)

# 转换日期列格式为datetime(注意原格式是MM-DD-YYYY)
df['StartDate'] = pd.to_datetime(df['StartDate'], format='%m-%d-%Y')
df['EndDate'] = pd.to_datetime(df['EndDate'], format='%m-%d-%Y')

# 定义生成月份列表的函数
def generate_month_sequence(row):
    start_month = row['StartDate'].month
    start_year = row['StartDate'].year
    end_month = row['EndDate'].month
    end_year = row['EndDate'].year
    
    month_list = []
    if start_year == end_year:
        # 同一年份,直接生成从起始月到结束月的序列
        month_list = list(range(start_month, end_month + 1))
    else:
        # 跨年份:先取起始年剩余月份,再取结束年的前几个月
        month_list.extend(range(start_month, 13))
        month_list.extend(range(1, end_month + 1))
    
    # 转换为逗号分隔的字符串
    return ','.join(map(str, month_list))

# 新增Month列
df['Month'] = df.apply(generate_month_sequence, axis=1)

# 查看结果
print(df)

运行结果

最终输出的DataFrame与期望完全一致:

StartDate   EndDate          Month
0 2010-01-15 2010-08-15  1,2,3,4,5,6,7,8
1 2009-07-01 2010-01-13  7,8,9,10,11,12,1

内容的提问来源于stack exchange,提问作者Hanaa Majzoub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:25:57