2016-02-25 57 views
4

我目前遇到了Python问题。我有一个Pandas DataFrame,其中一列是一个带日期的字符串。 格式为:将一列日期时间转换为Python中的纪元

“%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"))) 

你们知道如何将整列转换为纪元时间吗?

在此先感谢!

回答

6

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

In [2]: 
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 

你也可以看到,它是显著快

+0

谢谢您的回答!它工作得很好,它比for循环要快得多! – marcsarfa

+6

''df.date.astype('int64')// 1e9'',虽然稍微模糊 – Jeff

+2

@Jeff干杯,已经更新了我的答案 – EdChum

相关问题