python - 使用 pd.date_range() 转置 pandas DataFrame 的最快方法
问题描述
我有带有列的数据框,id
将其转换为带有and
的数据框的最快方法是什么start_dt
,其中每个列的 pd.date_range() 对应的开始日期和结束日期?我尝试通过从初始数据帧迭代然后 pd.concat() 的方法,它太慢了end_dt
id
dt
id
dt
例子:
初始数据框:
id; start_dt; end_dt
1 ;2019-01-01; 2019-01-03
2 ;2019-01-02; 2019-01-05
...
预期的数据框:
id; dt
1 ; 2019-01-01
1 ; 2019-01-02
1 ; 2019-01-03
2 ; 2019-01-02
2 ; 2019-01-03
2 ; 2019-01-04
2 ; 2019-01-05
解决方案
您将需要结合多种方式来完成这项工作。
- 应用
pd.date_range
函数并将explode
其展平 - 加入原版
df
reset_index
df = pd.DataFrame({'id': [1, 2, 3],
'start_dt': ['2019-08-01', '2019-08-03', '2019-08-05'],
'end_dt': ['2019-08-02', '2019-08-04', '2019-08-06']
})
df.start_dt = pd.to_datetime(df.start_dt) # Not really necessary
df.end_dt = pd.to_datetime(df.end_dt) # but good practice
time_series = (df[['start_dt', 'end_dt']]
.apply(lambda x: pd.date_range(*x, freq='6h'), # Change the freq as needed
axis=1)
.explode()
.rename('dt') # Give the new series a name
)
df[['id']].join(time_series).reset_index(drop=True)
id dt
0 1 2019-08-01 00:00:00
1 1 2019-08-01 06:00:00
2 1 2019-08-01 12:00:00
3 1 2019-08-01 18:00:00
4 1 2019-08-02 00:00:00
5 2 2019-08-03 00:00:00
6 2 2019-08-03 06:00:00
7 2 2019-08-03 12:00:00
8 2 2019-08-03 18:00:00
9 2 2019-08-04 00:00:00
10 3 2019-08-05 00:00:00
11 3 2019-08-05 06:00:00
12 3 2019-08-05 12:00:00
13 3 2019-08-05 18:00:00
14 3 2019-08-06 00:00:00
我选择了自己的时间实例,freq
但可以随意将其更改为适合您需要的任何时间。
推荐阅读
- javascript - 如何在 Angular 8 的 Cordova 函数中调用另一个函数?
- qt - 如何为 Visual Studio 项目构建 Qmake?专门用于 octomap 库的 QGLViewer
- laravel-6 - 检查日期是否不重叠
- linux - 用于运行命令并显示控制台输出的 Bash 脚本,直到出现某些短语或超时
- python - 需要帮助在 Python 中使用数字制作希尔伯特曲线
- javascript - Lazysizes.min.js 实现不起作用
- vue.js - 如何将用户信息从前端传递到后端
- php - 在 Laravel 中关联同一模型的多个单个实例
- c# - 我自己托管的 NuGet 服务器不再正常工作
- javascript - 有没有一种优雅的方法来检查对象中是否存在键和值然后使用它?