我目前遇到Python问题。我有一个Pandas DataFrame,其中一列是一个带日期的字符串。格式为:
“%Y-%m-%d%H:%m:00.000”。例如:“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")))
你们知道如何将整个列转换为纪元时间吗?
提前致谢 !
使用datetime
将字符串转换为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处理时间序列数据:
我们减去时期(UTC时间1970年1月1日午夜),然后除以“单位”(1 ms)。
stamps = pd.date_range('2012-10-08 18:15:05', periods=4, freq='D')
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms')
这将以毫秒为单位给出纪元时间。