Python 为大型数据集组合日期、小时和间隔列的更快方法

Python 为大型数据集组合日期、小时和间隔列的更快方法,python,pandas,datetime,for-loop,series,Python,Pandas,Datetime,For Loop,Series,我目前有一个大约120万行的数据集,其中包含日期、小时和间隔(四分之一小时)列 Delivery Date Delivery Hour Delivery Interval 1-1-2017 1 1 1-1-2017 1 2 1-1-2017 1 3 1-1-2017 1 4 我目前有一个for循环,可以将这些列

我目前有一个大约120万行的数据集,其中包含日期、小时和间隔(四分之一小时)列

Delivery Date      Delivery Hour Delivery Interval
1-1-2017           1             1
1-1-2017           1             2
1-1-2017           1             3
1-1-2017           1             4
我目前有一个for循环,可以将这些列合并到一个中,但我正在寻找一种更快的方法,因为这需要几个小时才能完成运行

for i in range(len(df_rt['Delivery Interval'])):

    hour = int(df_rt['Delivery Hour'][i]) - 1
    minute = (int(df_rt['Delivery Interval'][i]) - 1)*15
    df_rt['Time'][i] = str(hour) + ':' + str(minute)

df_rt['DateTime'] = df_rt['Delivery Date'] + " " + df_rt['Time']
df_rt['DateTime'] = pd.to_datetime(df_rt['DateTime'])

不是最干净的解决方案,但它避免了在数据帧中显式循环:

df['DateTime'] = pd.to_datetime(df['Delivery Date'].astype(str) + ' ' + 
    (df['Delivery Hour'].astype(int)-1).astype(str) + ':' + 
    ((df['Delivery Interval'].astype(int)-1)*15).astype(str))
给定示例数据帧,这将产生:

  Delivery Date  Delivery Hour  Delivery Interval            DateTime
0      1-1-2017              1                  1 2017-01-01 00:00:00
1      1-1-2017              1                  2 2017-01-01 00:15:00
2      1-1-2017              1                  3 2017-01-01 00:30:00
3      1-1-2017              1                  4 2017-01-01 00:45:00
以下各项应有效(方法1):

更快的方法(方法2):

时间:

方法1

2.53 ms ± 86.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
方法2

1.21 ms ± 67.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

一种有趣的方法是将序列转换为
datetime
对象的组件,然后将这些组件的数据帧传递给:


这将返回“不支持的+:'datetime.datetime'和'str'操作数类型”错误我不确定原始的
Delivery Date
列的类型是
str
还是
datetime
。编辑我的答案,现在就试试。
2.53 ms ± 86.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.21 ms ± 67.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
df[['month', 'day', 'year']] = df['DeliveryDate'].str.split('-', expand=True)
df['DeliveryHour'] -= 1
df['DeliveryInterval'] = (df['DeliveryInterval'] - 1) * 15
df = df.rename(columns={'DeliveryHour': 'hour', 'DeliveryInterval': 'minute'})

print(pd.to_datetime(df[['year', 'month', 'day', 'hour', 'minute']]))

0   2017-01-01 00:00:00
1   2017-01-01 00:15:00
2   2017-01-01 00:30:00
3   2017-01-01 00:45:00
dtype: datetime64[ns]