Python 为大型数据集组合日期、小时和间隔列的更快方法
我目前有一个大约120万行的数据集,其中包含日期、小时和间隔(四分之一小时)列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循环,可以将这些列
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]