Pandas DataFrame按Delivery Period时间区间拆分多行并标准化日期格式的实现需求
Pandas DataFrame按Delivery Period时间区间拆分多行并标准化日期格式的实现需求
看起来你需要处理DataFrame中Delivery Period列的两种格式数据:一种是跨多个月的日期区间(如"2025-01-01 to 2025-12-31"),需要拆分成每个单独月份的行并统一格式为"Month Year";另一种是已经符合格式的单月份数据,直接保留即可。下面是完整的实现方案:
步骤1:导入依赖库
首先确保你已经安装了pandas和python-dateutil,然后导入必要的库:
import pandas as pd from dateutil import parser
步骤2:构建原始DataFrame
先把你提供的示例数据转换成DataFrame:
data_dict_cols = { 'Price Curve': [ "TEST", "some curve", "some curve", "some curve", "some curve", "some curve", "some curve", "some curve" ], 'Text': [ "TEST", "some text", "some text", "some text", "some text", "some text", "some text", "some text" ], 'Delivery Period': [ "2025-01-01 to 2025-12-31", "June 2025", "July 2025", "August 2025", "September 2025", "October 2025", "November 2025", "December 2025" ] } df = pd.DataFrame(data_dict_cols)
步骤3:编写日期区间处理函数
我们需要一个自定义函数,用来解析每个Delivery Period值:如果是区间格式,生成区间内所有月份的"Month Year"字符串;如果是单月份格式,直接返回包含原字符串的列表(方便后续拆分)。
def expand_delivery_period(period_str): # 识别是否为日期区间格式 if 'to' in period_str: # 拆分起始和结束日期 start_date_str, end_date_str = period_str.split(' to ') start_date = parser.parse(start_date_str) end_date = parser.parse(end_date_str) # 生成区间内每个月的第一天,再格式化为目标格式 months = pd.date_range(start=start_date, end=end_date, freq='MS') return [month.strftime('%B %Y') for month in months] else: # 已经是单月份格式,返回列表形式便于explode return [period_str]
步骤4:应用函数并展开多行
对Delivery Period列应用处理函数,再用explode将列表拆分为单独的行:
# 生成每个行对应的月份列表 df['Delivery Period'] = df['Delivery Period'].apply(expand_delivery_period) # 展开列表为独立行,重置索引 df_expanded = df.explode('Delivery Period').reset_index(drop=True)
验证结果
运行后打印df_expanded,就能得到你期望的输出:TEST行被拆分成12个月份的独立行,其他单月份行保持不变,所有Delivery Period都统一为"Month Year"格式。
关键细节说明
pd.date_range的freq='MS'参数确保生成每个月的第一天,完美覆盖区间内的所有月份。strftime('%B %Y')用来将日期格式化为完整月份名称+年份(如January 2025)。explode方法会自动将列表格式的单元格内容拆分为多行,同时保留其他列的对应值,完全符合你的需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

