python - 如何在 Python 中有效地将字符串类型的数据框列转换为日期时间?

标签 python r pandas datetime dataframe

我有一个包含 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')

这会在 32 秒内完成 720 万行的工作。然而,在 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

关于python - 如何在 Python 中有效地将字符串类型的数据框列转换为日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100344/

相关文章:

python - 从 Spark DataFrame 选择空数组值

python - ffmpeg 将多张图片放入不同的帧中

python - 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

python - 将数据发布到 Sentiment140 进行情绪分析

Python普通字典到有序字典的转换

r - 在 R 中将多行转换为单列

r - 如何根据满足的条件和时间顺序对 r 中的数据进行排序?

r - 使用ggplot facet_grid在不同条件下相同变量的散点图?

python - Pandas 按列对 Excel 数据进行分组,并用均值绘制散点图

python - 如何使用循环为数据帧提供顺序名称?