如何用Pandas将DataFrame按季度拆分为月度行,行数扩3倍?
如何将Pandas季度数据拆分为月度数据
完全有简便的方法实现!核心思路是为每行季度数据生成对应季度的所有月份列表,再通过explode方法将列表拆分为单独行,几步就能完成5行到15行的扩展。下面是具体实现步骤:
步骤1:准备数据并转换日期类型
首先确保你的日期列是datetime类型,方便后续生成月份:
import pandas as pd # 构造你的示例DataFrame(如果已有真实数据可跳过这步) data = { 'Deal Date': ['2011-11-01']*5, 'Period Name': ['2011-Q4', '2012-Q1', '2012-Q2', '2012-Q3', '2012-Q4'], 'Price': [30.76, 30.95, 30.67, 29.87, 29.49], 'Quarter Start': ['2011-10-01', '2012-01-01', '2012-04-01', '2012-07-01', '2012-10-01'], 'Quarter End': ['2011-12-31 23:59:59.999999999']*5 } df = pd.DataFrame(data) # 将Quarter Start转换为datetime类型 df['Quarter Start'] = pd.to_datetime(df['Quarter Start'])
步骤2:生成每个季度的月份列表
对每行的季度起始日期,生成该季度包含的3个月份的数字(比如2011-Q4对应[10,11,12]):
# 利用pd.date_range生成季度内的所有月初日期,再提取月份数字 df['Month'] = df['Quarter Start'].apply( lambda x: pd.date_range(start=x, periods=3, freq='MS').month.tolist() )
这里freq='MS'表示每月第一天,periods=3表示生成3个日期,最后用.month提取月份数字。
步骤3:拆分列表为多行
用explode方法将每个列表拆分为单独的行,同时重置索引:
# 扩展DataFrame df_expanded = df.explode('Month', ignore_index=True)
可选调整:显示完整日期而非月份数字
如果需要Month列显示为完整日期(比如2011-10-01),只需要修改步骤2的代码,提取日期而非月份数字:
df['Month'] = df['Quarter Start'].apply( lambda x: pd.date_range(start=x, periods=3, freq='MS').date.tolist() )
执行完后,df_expanded就会有15行数据,每行对应一个月份,原行的其他列(Deal Date、Price等)会自动保留对应值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

