如何根据日期调整Pandas DataFrame的结构?
问题描述
我有如下初始Pandas DataFrame:
| ID | Parameter | Start | End |
|---|---|---|---|
| 1 | 4 | 05.05.2023 | 07.05.2023 |
| 2 | 2 | 05.05.2023 | 06.05.2023 |
| 3 | 1 | 08.05.2023 | 09.05.2023 |
想要将其转换为以下结构,本质是对时间段进行逆透视,展开Start到End之间的所有日期:
| ID | Parameter | Date |
|---|---|---|
| 1 | 4 | 05.05.2023 |
| 1 | 4 | 06.05.2023 |
| 1 | 4 | 07.05.2023 |
| 2 | 2 | 05.05.2023 |
| 2 | 2 | 06.05.2023 |
| 3 | 1 | 08.05.2023 |
| 3 | 1 | 09.05.2023 |
解决方案
完全可以实现,以下是具体步骤和代码:
先将日期列转换为Pandas可识别的datetime类型,然后为每一行生成Start到End之间的所有日期序列,最后通过explode方法展开序列即可:
import pandas as pd # 构造初始数据 df = pd.DataFrame({ 'ID': [1, 2, 3], 'Parameter': [4, 2, 1], 'Start': ['05.05.2023', '05.05.2023', '08.05.2023'], 'End': ['07.05.2023', '06.05.2023', '09.05.2023'] }) # 转换日期格式为datetime类型 df[['Start', 'End']] = df[['Start', 'End']].apply(pd.to_datetime, format='%d.%m.%Y') # 为每行生成连续日期序列 df['Date'] = df.apply(lambda x: pd.date_range(x['Start'], x['End'], freq='D'), axis=1) # 展开日期序列并清理多余列 result = df.explode('Date').drop(['Start', 'End'], axis=1) # 将日期转回原字符串格式(可选,若需要保留原显示格式) result['Date'] = result['Date'].dt.strftime('%d.%m.%Y') print(result)
执行代码后即可得到目标结构的DataFrame。
内容的提问来源于stack exchange,提问作者question12
相关产品推荐
相关产品推荐

