在Python中将日期时间列转换为历元

2024-05-17 06:32:02 发布

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

我目前对Python有一个问题。我有一个熊猫数据框,其中一列是带有日期的字符串。 格式为:

"%Y-%m-%d %H:%m:00.000". For example : "2011-04-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")))

你们知道怎么把整列转换成大纪元时间吗

提前谢谢


Tags: 数据字符串代码infortimeexample格式
3条回答

使用to_datetime将字符串转换为datetime,然后减去日期时间1970-1-1并调用dt.total_seconds()

In [2]:
import pandas as pd
import datetime as dt
df = pd.DataFrame({'date':['2011-04-24 01:30:00.000']})
df

Out[2]:
                      date
0  2011-04-24 01:30:00.000

In [3]:
df['date'] = pd.to_datetime(df['date'])
df

Out[3]:
                 date
0 2011-04-24 01:30:00

In [6]:    
(df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()

Out[6]:
0    1303608600
Name: date, dtype: float64

您可以看到,将此值转换回的时间相同:

In [8]:
pd.to_datetime(1303608600, unit='s')

Out[8]:
Timestamp('2011-04-24 01:30:00')

因此,您可以添加新列或覆盖:

In [9]:
df['epoch'] = (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
df

Out[9]:
                 date       epoch
0 2011-04-24 01:30:00  1303608600

编辑

@Jeff建议的更好的方法:

In [3]:
df['date'].astype('int64')//1e9

Out[3]:
0    1303608600
Name: date, dtype: float64

In [4]:
%timeit (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
%timeit df['date'].astype('int64')//1e9

100 loops, best of 3: 1.72 ms per loop
1000 loops, best of 3: 275 µs per loop

您还可以看到,它的速度要快得多

从处理时间序列数据的Pandas documentation开始:

We subtract the epoch (midnight at January 1, 1970 UTC) and then floor divide by the “unit” (1 ms).

# generate some timestamps
stamps = pd.date_range('2012-10-08 18:15:05', periods=4, freq='D')

# convert it to milliseconds from epoch
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms')

这将给出以毫秒为单位的历元时间

我知道这很古老,但我相信正确的(最干净的)方法是下面的一行:

calls['DATE'].apply(lambda x: x.timestamp())

这假定calls['DATE']datetime64[ns]类型。如果不是,请将其转换为:

pd.to_datetime(calls['DATE'], format="%Y-%m-%d %H:%m:00.000")

解释

要获取pd.Timestamp的历元值(以秒为单位),请使用:

pd.Timestamp('20200101').timestamp()

这应该给你1577836800.0。如果需要,可以将其转换为int。它之所以是浮点,是因为任何亚秒时间都将是小数部分

为完整起见,您还可以使用以下方法获取原始历元值(以纳秒为单位):

pd.Timestamp('20200101').value

给出15778368000000000,即上述日期的纪元。.value属性是自epoch以来的纳秒数,所以我们除以1e6得到毫秒。如果希望第一次调用以秒为单位,则除以1e9

相关问题 更多 >