如何在Pandas DataFrame中生成两日期列之间的所有月份?
解决DataFrame中生成日期区间内所有月份的问题
需求说明
需要基于DataFrame的StartDate和EndDate列,生成两日期之间的所有月份,新增Month列并以逗号分隔的形式展示月份数字。
原始DataFrame
| StartDate | EndDate |
|---|---|
| 01-15-2010 | 08-15-2010 |
| 07-01-2009 | 01-13-2010 |
期望输出
| StartDate | EndDate | Month |
|---|---|---|
| 01-15-2010 | 08-15-2010 | 1,2,3,4,5,6,7,8 |
| 07-01-2009 | 01-13-2010 | 7,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)
问题分析
这段代码存在两个核心问题:
- 日期类型未转换:原始的
StartDate和EndDate是字符串格式,直接调用.month属性会报错,无法正确获取月份。 - 未处理跨年场景:当
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
相关产品推荐
相关产品推荐

