在熊猫中将毫秒设置为小时,最长 24 小时

Posted

技术标签:

【中文标题】在熊猫中将毫秒设置为小时,最长 24 小时【英文标题】:Set milliseconds to hours in pandas up to 24 hours 【发布时间】:2019-05-01 21:42:48 【问题描述】:

我有以下 DataFrame 总结了我在数据集中遇到的不同情况:

import pandas as pd
import numpy as np

df = pd.DataFrame('date': [20120302, 20141017, 20150215], 
                   'time': [764, 17002, 110000517], dtype=np.uint64)

我在df.time 列中看到的数字是类似单位的,随着时间的推移而增加,直到接近240000000(例如,最后一个条目可能是235959281)。如您所想,它们加起来是 24 小时(一天)。

我想将两列合并形成一个 date_time 格式的 datetime64[ns] 列,以便我可以使用 pandas 进一步分析。

问题:

我可以加入它们(即将它们转换为 str),但我没有得到我想要的确切日期时间格式。当我加入他们时,我会得到这些值,例如:

20120302764
2014101717002
20150215110000517

我想得到:

2012-03-02 00:00:00.764

2014-10-17 00:00:17.002

2015-02-15 11:00:00.517

就我而言:

尝试使用pd.to_datetime() 直接转换失败,即使提供'%Y-%m-%d %H:%M:%S.%f' 格式。

我可以将timedelta64[ns] 对象与datetime64[ns] 连接起来形成最后一列。但是,使用 timedelta 转换的单位并没有给出真正的小时、分钟、秒和毫秒。

问题是: ¿如何从这些“类似单位”的数量中获取小时、分钟、秒和毫秒,以便我可以将其加入日期列以形成完整的 date_time?

【问题讨论】:

"甚至提供 '%Y-%m-%d %H:%M:%S.%f' 格式。"因为格式字符串应该反映 current 格式。所以像%Y%m%d 这样的date 列。想想看,你告诉数据框如何读取你给它的完全无上下文的数字系列。 @roganjosh True Rogan,说的方式不是最好的。我完全理解您的意思:即使提供良好的格式,有时格式不匹配并失败。感谢您的快速回答。 【参考方案1】:
import pandas as pd
import numpy as np

df = pd.DataFrame('date': [20120302, 20141017, 20150215], 
                   'time': [764, 17002, 110000517], dtype=np.uint64)

df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

df['combined'] = df['date'] + pd.to_timedelta(df['time'], unit='ms')

print(df.head())

您尝试的问题是format 应该反映现有 数据的格式。你需要告诉pandas 如何阅读20120302。然后只需告诉Pandasto_timedelta 中的时间单位并将其添加到您的日期时间列中。

【讨论】:

这是我最初的建议,但实际上并不是 OP 所要寻找的:查看他们预期输出的最后一行 (2015-02-15 11:00:00.517),与您方法的输出 ( 2015-02-16 06:33:20.517)。它实际上并不是 OP 输入的 time 列中表示的毫秒数 @sacul 嗯,好地方。让我看看我是否可以修复它并使其与您的方法不同。 最终我不认为我可以在这里绕过 sacul 的方法,但我会为可以避免字符串方法的东西而杀戮,因为它们是可怕对 python 的低效包装器字符串类型。我再试试看。 @Ezarate,有数千行,你应该没问题(刚刚尝试了 30000,它在几分之一秒内完成)。如果您开始进入数十万行,使用字符串方法会开始变得有点慢(300000 行大约需要 3 秒) 但是@roganjosh,我同意,如果可能的话最好避免使用字符串方法...【参考方案2】:

我会将其全部转换为字符串,就您而言,在时间列上使用zfill(9),以便它们都有 9 位缺少零的数字,将它们全部连接在一起(日期和时间),然后使用pd.to_datetime 具有适当的格式:

df['datetime'] = pd.to_datetime(df.date.astype(str) + df.time.astype(str).str.zfill(9),
                                format='%Y%m%d%H%M%S%f')

>>> df
       date       time                datetime
0  20120302        764 2012-03-02 00:00:00.764
1  20141017      17002 2014-10-17 00:00:17.002
2  20150215  110000517 2015-02-15 11:00:00.517

【讨论】:

哇,太完美了。我错过了填充其他零以使格式匹配的方式。非常好,非常感谢@sacul 的快速回复。已解决。

以上是关于在熊猫中将毫秒设置为小时,最长 24 小时的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中将 4 位数字转换为小时:分钟时间格式

在熊猫`DataFrame`中将`TimeStamp`列截断为小时精度

如何在 html5 日期时间选择器中将格式从 12 小时更改为 24 小时?

在 sparklyr 中将 12 小时制转换为 24 小时制

在 ZonedDateTime 或 Instant 中将小时分钟和秒设置为 00

安卓手机时间24小时怎么设置?