2014-09-03 66 views
11

我有一個數據幀以下幾點:從熊貓轉換時區的時間戳

> df['timestamps'].loc[0] 
Timestamp('2014-09-02 20:24:00') 

我知道時區(我認爲這是GMT)它使用,並想整列轉換爲EST。我如何在熊貓中做到這一點?

僅供參考,我發現這些其他線程:

,但他們與datetime時間戳工作。例如: -

> datetime.datetime.fromtimestamp(df['timestamps'].loc[0], tz=None) 
returns: 

TypeError         Traceback (most recent call last) 
----> 2 datetime.datetime.fromtimestamp(ts, tz=None) 

TypeError: an integer is required (got type Timestamp) 

回答

19

只需使用tz_convert方法。

比方說你有一個Timestamp對象:

stamp = Timestamp('1/1/2014 16:20', tz='America/Sao_Paulo') 
    new_stamp = stamp.tz_convert('US/Eastern') 

如果你有興趣的轉換日期範圍:

range = date_range('1/1/2014', '1/1/2015', freq='S', tz='America/Sao_Paulo') 
    new_range = range.tz_convert('US/Eastern') 

對於大的時間序列:

import numpy as np 
    ts = Series(np.random.randn(len(range)), range) 
    new_ts = ts.tz_convert('US/Eastern') 

項記載另一個答案是,如果你的數據沒有設置時區,你需要tz_localize它:

data.tz_localize('utc') 
+0

謝謝,但是當我嘗試: 'DF [ '時間戳'] [0] .tz_convert( '美國/東部')'我得到: '異常:無法轉換TZ-天真的時間戳,使用tz_localize或本地化' – 2014-09-03 22:02:42

+2

同樣,如果我嘗試直接使用列: 'df ['timestamps']。tz_convert('US/Eastern')' 'TypeError:索引不是有效的DatetimeIndex或PeriodIndex' – 2014-09-03 22:03:29

+0

@ user815423426您需要先tz_localize(如我的答案結尾處所述),如果您不知道您開始使用什麼時區,則無法轉換爲時區。 – 2014-09-03 22:05:31

3

日期時間的fromtimestamp實際上從POSIX時間戳即毫秒爲1970-1-1 GMT

In [11]: datetime.datetime.fromtimestamp? 
Type:  builtin_function_or_method 
String form: <built-in method fromtimestamp of type object at 0x101d90500> 
Docstring: timestamp[, tz] -> tz's local time from POSIX timestamp. 

In [12]: datetime.datetime.fromtimestamp(0) 
Out[12]: datetime.datetime(1969, 12, 31, 16, 0) 

In [13]: datetime.datetime.fromtimestamp(1) 
Out[13]: datetime.datetime(1969, 12, 31, 16, 0, 1) 

我想,也許是一個問題,因爲我在PST時區來的。

這與熊貓Timestamp不同(儘管在1970-1-1的ns範圍內)。

In [21]: pd.Timestamp(0) 
Out[21]: Timestamp('1970-01-01 00:00:00') 

要轉換一個時間戳/ datetime64列使用tz_convert(如果是TZ天真,即沒有一個時區的是,你需要tz_localize在前):

In [31]: pd.Timestamp(0).tz_localize('UTC') 
Out[31]: Timestamp('1970-01-01 00:00:00+0000', tz='UTC') 

In [32]: t = pd.Timestamp(0).tz_localize('UTC') 

In [33]: t.tz_convert('US/Eastern') 
Out[33]: Timestamp('1969-12-31 19:00:00-0500', tz='US/Eastern') 

time-zone-handling section of the docs