Python:在dataframe列中将秒转换为datetime格式

2024-06-17 14:57:40 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我正在处理一个大数据帧(12x47800)。12列中有一列是由整数秒组成的列。我想将此列更改为包含日期时间.time格式。Schedule是我的数据帧,我尝试在其中更改名为“depTime”的列。既然我想让它成为日期时间.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还很陌生,如果有人能帮我的话,我会非常感激的:)


Tags: 数据iftime格式时间整数secmin
2条回答

我添加了一个新的解决方案,它比原来的解决方案快得多,因为它依赖于pandas矢量化函数而不是循环(pandas apply函数本质上是对数据进行优化的循环)。在

我用一个和你的尺寸差不多的样品来测试它,差别是从778毫秒到21.3毫秒,所以我绝对推荐这个新版本。在

这两种解决方案都基于将秒整数转换为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[s]') + start

time_series = datetime_series.dt.time

time_series

原始(较慢)答案:

虽然不是最优雅的解决方案,但它确实很管用。在

^{pr2}$

您应该尽量不要对数据帧进行完全扫描,而是使用矢量化访问,因为它通常效率更高。在

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

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

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

如果您真的需要datetime.time对象,可以通过这种方式获得它们:

^{pr2}$

但在pandas数据帧中使用它们不太方便。在

相关问题 更多 >