在熊猫中将毫秒设置为小时,最长 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
。然后只需告诉Pandas
to_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 小时的主要内容,如果未能解决你的问题,请参考以下文章
在熊猫`DataFrame`中将`TimeStamp`列截断为小时精度
如何在 html5 日期时间选择器中将格式从 12 小时更改为 24 小时?
在 sparklyr 中将 12 小时制转换为 24 小时制