如何将pandas DataFrame两列起止日期间的所有日期按行展开保留对应字段
解决方案
首先确认你的pandas版本支持explode方法(pandas 0.25及以上版本均支持,完全适配你使用的JupyterLab 3.1.9环境),实现代码如下:
import pandas as pd # 第一步:将日期列转为datetime类型,避免字符串格式导致的计算错误 df['StartDate'] = pd.to_datetime(df['StartDate']) df['EndDate'] = pd.to_datetime(df['EndDate']) # 第二步:对每行生成起止日期范围内的所有连续日期序列 df['Date'] = df.apply(lambda x: pd.date_range(start=x['StartDate'], end=x['EndDate'], freq='D'), axis=1) # 第三步:将日期序列拆分为单独行,保留对应ProductId,筛选需要的字段 df1 = df.explode('Date')[['ProductId', 'Date']].reset_index(drop=True) # 如果需要Date列为字符串格式,可额外执行下面这行 # df1['Date'] = df1['Date'].dt.strftime('%Y-%m-%d')
运行后得到的df1即为你要求的输出格式。
如果你的pandas版本低于0.25不支持explode,可以使用遍历的替代方案:
df_list = [] for _, row in df.iterrows(): date_range = pd.date_range(start=row['StartDate'], end=row['EndDate'], freq='D') temp_df = pd.DataFrame({'ProductId': [row['ProductId']]*len(date_range), 'Date': date_range}) df_list.append(temp_df) df1 = pd.concat(df_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者Tanvi Mirza
相关产品推荐
相关产品推荐

