Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在数据帧列中将秒转换为日期时间格式_Python_Pandas_Datetime_Seconds - Fatal编程技术网

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

Python:在数据帧列中将秒转换为日期时间格式,python,pandas,datetime,seconds,Python,Pandas,Datetime,Seconds,目前我正在使用一个大数据帧(12x47800)。十二列中的一列是由整数秒组成的列。我想将此列更改为包含datetime.time格式的列。Schedule是我尝试更改名为“depTime”的列的数据帧。因为我希望它是一个datetime.time,并且它可以跨越午夜,所以我添加了if语句。这“有效”,但正如人们所能想象的那样,速度非常慢。有没有更快的方法? 我目前的代码,我唯一可以使用的代码是: for i in range(len(schedule)): t_sec = schedul

目前我正在使用一个大数据帧(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非常陌生,如果有人能帮助我,我将非常感激:)

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

我用一个和你的样品大小相似的样品测试了它,差异从778毫秒到21.3毫秒。所以我绝对推荐新版本

这两种解决方案都基于将秒整数转换为timedelta格式并将其添加到引用datetime。然后,我简单地捕获结果datetimes的时间组件

新(更快)选项:

原始(较慢)答案:

这不是最优雅的解决方案,但它确实做到了

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

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

幸运的是,pandas有一个函数可以完全满足您的要求,
to_timedelta

schedule['depTime'] = pd.to_timedelta(schedule['depTime'], unit='s')
它实际上不是一种日期时间格式,但它相当于
datetime.timedelta
,是处理时间的一种方便类型。您可以使用
来创建日期时间,但将以接近1970-01-01的完整日期时间结束

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

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

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

您能提供一个简短的数据示例吗?例如,
schedule.head(20)
你确定你的专栏记录的是一天中的时间而不是持续时间吗?有一点不同,一天的时间被限制在[0-86400)秒(86401表示闰秒),持续时间不受限制,可以是负数。蒙蒂在下午3点10分越过终点线,时间为2小时35分5秒,有一天的时间和持续时间。你想使用
timedelta
表示持续时间,而不是
time
。这似乎是一个合适的解决方案,我尝试了使用to_datetime。请参阅ms非常接近我想要实现的目标,但问题是我得到了一个datetime.datetime,然后我仍然需要将其转换为datetime.time格式。我尝试使用.time,但我得到的“Series”对象没有属性“time”。我理解。从这一点上说,有没有一种简单的方法将datetime.datetime转换为datetime.time?@Hestaron:
time
属性在这里可以帮助您:查看我的编辑。如果有人在寻找性能方面的原因,用这种方式转换为timedelta肯定比转换为time对象要好。此解决方案似乎非常有效。因为我的代码需要实时运行(最终)时间是至关重要的,它运行得非常快。你能详细说明一下它是如何工作的以及为什么工作的吗?@Hestaron我提出了一个新的解决方案,似乎效果更好。建议你看看。
astype('timedelta64[ms]'
)将数字转换为毫秒(无秒),然后添加任意历元,并使用
.dt.time
从中提取时间对象。除了使用毫秒而不是秒外,它只比使用
pd.to_datetime(秒,unit='s').dt.time
(586 us vs 714 us)稍微快一点。
schedule['depTime'] = pd.to_datetime(schedule['depTime'], unit='s').dt.time