如何将Pandas中数组类列展开成行并生成连续日期列?
解决方案
1. 展开数组列
先用explode方法将daily_sales列的数组拆分为单行数据,保留对应月份的起始日期:
from datetime import date import pandas as pd import numpy as np # 原输入数据 data = pd.DataFrame([(date(2022,1,1), np.random.randint(10, size=30)), (date(2022,2,1),np.random.randint(10, size=30)), (date(2022,3,1),np.random.randint(10, size=30))], columns=('month_begin','daily_sales')) # 拆分数组列并重置索引 data_exploded = data.explode('daily_sales', ignore_index=True) # 转换数据类型为整数(可选,避免object类型) data_exploded['daily_sales'] = data_exploded['daily_sales'].astype(int)
2. 生成连续日期
通过分组处理,为每个月份的行生成对应日期:
def assign_dates(group): start_date = group['month_begin'].iloc[0] # 生成从当月1号开始的连续日期,长度匹配组内数据行数 date_series = pd.date_range(start=start_date, periods=len(group)) group['date'] = date_series.date # 转为date类型,与原字段格式统一 return group # 应用分组生成日期 final_data = data_exploded.groupby('month_begin', group_keys=False).apply(assign_dates)
修正月份天数匹配问题
注意2022年2月实际只有28天,原数据中每个月份都用了30个数据会导致日期超出当月范围。如果需要严格对应实际日历,建议调整原数据的数组长度:
# 生成符合实际月份天数的数据源 data_fixed = pd.DataFrame([ (date(2022,1,1), np.random.randint(10, size=31)), # 1月31天 (date(2022,2,1), np.random.randint(10, size=28)), # 2月28天 (date(2022,3,1), np.random.randint(10, size=31)) # 3月31天 ], columns=('month_begin','daily_sales')) # 重复拆分和日期生成步骤 data_fixed_exploded = data_fixed.explode('daily_sales', ignore_index=True) data_fixed_exploded['daily_sales'] = data_fixed_exploded['daily_sales'].astype(int) final_data_fixed = data_fixed_exploded.groupby('month_begin', group_keys=False).apply(assign_dates)
处理完成后,final_data(或final_data_fixed)将包含连续日期列date和对应每日销售数据的daily_sales列,每行对应一天的记录。
内容的提问来源于stack exchange,提问作者Rachel Zhang
相关产品推荐
相关产品推荐

