首页 > 解决方案 > 使用 pd.date_range() 转置 pandas DataFrame 的最快方法

问题描述

我有带有列的数据框,id将其转换为带有and 的数据框的最快方法是什么start_dt,其中每个列的 pd.date_range() 对应的开始日期和结束日期?我尝试通过从初始数据帧迭代然后 pd.concat() 的方法,它太慢了end_dtiddtiddt

例子:

初始数据框:

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

标签: pythonpandas

解决方案


您将需要结合多种方式来完成这项工作。

  1. 应用pd.date_range函数并将explode其展平
  2. 加入原版df
  3. 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但可以随意将其更改为适合您需要的任何时间。


推荐阅读