我目前在使用Python时遇到了一个问题。我有一个Pandas DataFrame,其中一列是一个带日期的字符串。格式为:
“%Y-%m-%d %H:%m:00.000”。例如:“2011年4月24日01:30:00.000”
我需要将整个列转换为整数。我试着运行这段代码,但它非常慢,而且我有几百万行。
for i in range(calls.shape[0]):
calls['dateint'][i] = int(time.mktime(time.strptime(calls.DATE[i], "%Y-%m-%d %H:%M:00.000")))
你们知道怎么把整列时间换算成纪元时间吗?
5条答案
按热度按时间vhmi4jdf1#
使用
to_datetime
将字符串转换为datetime
,然后减去日期时间1970-1-1,并调用dt.total_seconds()
:您可以看到,将此值转换回来会产生相同的时间:
因此,您可以添加新列或覆盖:
编辑
更好的方法是@Jeff:
您还可以看到,它的速度明显加快
zyfwsgd62#
我知道这是旧的,但我相信正确的(和最干净的)方式是下面的一行:
假设
calls['DATE']
是datetime64[ns]
类型。如果不是,请转换为:说明
要获取
pd.Timestamp
的历元值(以秒为单位),请用途:这应该会给予你
1577836800.0
。如果你愿意的话,你可以转换成int
。它是浮点的原因是因为任何亚秒的时间都会在小数部分。您还可以获取原始纪元值(单位为纳秒):
给出1577836800000000000,它是上述日期的epoch。
.value
属性是epoch之后的纳秒数,因此除以1e6可得到毫秒。如果希望epoch以秒为单位作为第一次调用,则除以1e9。vojdkbi03#
从Pandas关于处理时间序列数据的文档中:
我们减去历元(1970年1月1日的午夜UTC),然后将下限除以“单位”(1毫秒)。
这将给予以毫秒为单位的历元时间。
5cnsuln74#
为了扩展s5s的答案,我认为代码可以进一步推广以满足缺失的数据(例如,用pd.NaT表示)。在Pandas 1.2.4上测试,在Pandas〈1.0上不起作用。
一些评论:
示例输出:
dy1byipe5#
另一种方法是,在减去Unix epoch之后,将dtype转换为
'timedelta64[s]'
(注意[s]
)以指定您希望差值以秒为单位,或者将dtype转换为'timedelta[ms]'
以指定它应该以毫秒为单位,等等。