Python:在数据框列中将秒转换为日期时间格式

时间:2019-03-05 13:06:00

标签: python pandas datetime seconds

目前,我正在处理一个大型数据框(12x47800)。十二列之一是由整数秒组成的列。我想将此列更改为由datetime.time格式组成的列。 Schedule是我的数据框,在这里我尝试更改名为“ depTime”的列。由于我希望它是datetime.time,并且可能会超过午夜,所以我添加了if语句。这是“有效的”,但确实令人难以想象。有更快的方法吗? 我当前的代码,唯一可以使用的代码是:

for i in range(len(schedule)):
    t_sec = schedule.iloc[i].depTime
    [t_min, t_sec] = divmod(t_sec,60)
    [t_hour,t_min] = divmod(t_min,60)
    if t_hour>23:
        t_hour -= 23
    schedule['depTime'].iloc[i] = dt.time(int(t_hour),int(t_min),int(t_sec))

先谢谢大家。

Ps:我对Python还是很陌生,所以如果有人可以帮助我,我将非常感激:)

2 个答案:

答案 0 :(得分:1)

我要添加一个比原始解决方案快得多的新解决方案,因为它依赖于熊猫矢量化函数而不是循环(熊猫应用函数本质上是对数据的优化循环)。

我用大小与您相似的样本进行了测试,其差异为778ms至21.3ms。因此,我绝对推荐新版本。

这两种解决方案均基于将秒整数转换为timedelta格式并将其添加到参考日期时间。然后,我只捕获结果日期时间的时间部分。

新(更快)选项:

import datetime as dt

seconds = pd.Series(np.random.rand(50)*100).astype(int) # Generating test data

start = dt.datetime(2019,1,1,0,0) # You need a reference point

datetime_series = seconds.astype('timedelta64[ms]') + dt.datetime(2019,1,1,0,0)

time_series = datetime_series.dt.time

time_series

原始(较慢)答案:

这不是最优雅的解决方案,但是可以解决问题。

import datetime as dt

seconds = pd.Series(np.random.rand(50)*100).astype(int) # Generating test data

start = dt.datetime(2019,1,1,0,0) # You need a reference point

time_series = seconds.apply(lambda x: start + pd.Timedelta(seconds=x)).dt.time

time_series

答案 1 :(得分:1)

您不应尝试对数据帧进行全面扫描,而应使用矢量化访问,因为它通常效率更高。

幸运的是,pandas的功能完全符合您的要求to_timedelta

schedule['depTime'] = pd.to_timedelta(schedule['depTime'], unit='s')

它不是真正的日期时间格式,但它与datetime.timedelta等效,是处理时间的便捷类型。您可以使用to_datetime,但将以接近1970-01-01的完整日期时间结束...

如果您确实需要datetime.time对象,则可以通过以下方式获取它们:

schedule['depTime'] = pd.to_datetime(schedule['depTime'], unit='s').time

但是在熊猫数据框中使用它们不太方便。