2016-02-25 56 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

相關問題