[英]How to convert efficiently a dataframe column of string type into datetime in Python?
我有一个带有ID的列,时间在其中编码。 例如:
0 020160910223200_T1
1 020160910223200_T1
2 020160910223203_T1
3 020160910223203_T1
4 020160910223206_T1
5 020160910223206_T1
6 020160910223209_T1
7 020160910223209_T1
8 020160910223213_T1
9 020160910223213_T1
如果我们删除第一个和最后三个字符,我们获得第一行:20160910223200,应该转换为2016-09-10 22:32:00。
我的解决方案是编写一个截断ID并转换为日期时间的函数。 然后,我将此函数应用于我的df列。
from datetime import datetime
def MeasureIDtoTime(MeasureID):
MeasureID = str(MeasureID)
MeasureID = MeasureID[1:14]
Time = datetime.strptime(MeasureID, '%Y%m%d%H%M%S')
return Time
df['Time'] = df['MeasureID'].apply(MeasureIDtoTime)
这可以正常工作,但对我的情况来说速度很慢。 我必须处理超过2000万行,我需要更快的解决方案。 想要更高效的解决方案吗?
更新
根据@MaxU,有一个更好的解决方案:
pd.to_datetime(df.ID.str[1:-3], format = '%Y%m%d%H%M%S')
对于720万行,这可以在32秒内完成工作。 但是,在R中,由于lubridate::ymd_hms()
函数,我在不到2秒的时间内完成了任务。 所以我想知道在Python中是否存在更好的解决方案。
更新:性能优化......
我们试着稍微优化一下
DF形状:50.000 x 1
In [220]: df.head()
Out[220]:
ID
0 020160910223200_T1
1 020160910223200_T1
2 020160910223203_T1
3 020160910223203_T1
4 020160910223206_T1
In [221]: df.shape
Out[221]: (50000, 1)
In [222]: len(df)
Out[222]: 50000
定时:
In [223]: %timeit df['ID'].apply(MeasureIDtoTime)
1 loop, best of 3: 929 ms per loop
In [224]: %timeit pd.to_datetime(df.ID.str[1:-3])
1 loop, best of 3: 5.68 s per loop
In [225]: %timeit pd.to_datetime(df.ID.str[1:-3], format='%Y%m%d%H%M%S')
1 loop, best of 3: 267 ms per loop ### WINNER !
结论:明确指定日期时间格式可将其加速21次。
注意:只有当您具有恒定的日期时间格式时才可能
老答案:
In [81]: pd.to_datetime(df.ID.str[1:-3])
Out[81]:
0 2016-09-10 22:32:00
1 2016-09-10 22:32:00
2 2016-09-10 22:32:03
3 2016-09-10 22:32:03
4 2016-09-10 22:32:06
5 2016-09-10 22:32:06
6 2016-09-10 22:32:09
7 2016-09-10 22:32:09
8 2016-09-10 22:32:13
9 2016-09-10 22:32:13
Name: ID, dtype: datetime64[ns]
其中df
是:
In [82]: df
Out[82]:
ID
0 020160910223200_T1
1 020160910223200_T1
2 020160910223203_T1
3 020160910223203_T1
4 020160910223206_T1
5 020160910223206_T1
6 020160910223209_T1
7 020160910223209_T1
8 020160910223213_T1
9 020160910223213_T1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.