2014-09-03 19 views
11

Tôi có sau đây trong một dataframe:múi giờ Chuyển đổi từ gấu trúc timestamps

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

Tôi biết múi giờ (Tôi nghĩ rằng đó là giờ) nó sử dụng và muốn chuyển đổi toàn bộ cột để EST. Làm thế nào tôi có thể làm điều đó trong Pandas?

Để tham khảo, tôi thấy những chủ đề khác:

nhưng họ làm việc với datetime timestamps. Ví dụ .: fromtimestamp

> 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) 

Trả lời

19

Chỉ cần sử dụng phương pháp tz_convert.

phép nói rằng bạn có một đối tượng Timestamp:

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

Nếu bạn quan tâm đến chuyển đổi phạm vi ngày:

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

Đối với chuỗi thời gian lớn:

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

Như đã nêu trong một câu trả lời khác, nếu dữ liệu của bạn không có bộ múi giờ, bạn cần phải tz_localize nó:

data.tz_localize('utc') 
+0

Cảm ơn, nhưng khi tôi cố gắng: 'df [ 'timestamps'] [0] .tz_convert ('Mỹ/Đông') 'tôi nhận được: ' Ngoại lệ: Không thể chuyển đổi Timestamp tz-ngây thơ, sử dụng tz_localize hoặc localize' –

+2

Tương tự nếu tôi cố gắng làm việc với cột trực tiếp: 'df ['dấu thời gian']. tz_convert ('US/Eastern')' 'TypeError: index không phải là một DateTime hợp lệ hoặc PeriodIndex' –

+0

@ user815423426 bạn cần để tz_localize đầu tiên (như đã đề cập ở cuối câu trả lời của tôi), bạn không thể chuyển đổi sang múi giờ nếu bạn không biết múi giờ nào bạn đã bắt đầu. –

3

datetime là thực sự từ một POSIX timestamp ví dụ: ms từ 1970/01/01 giờ

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) 

Tôi nghĩ rằng có lẽ là một vấn đề như tôi đang ở PST múi giờ.

Điều này khác với gấu trúc Dấu thời gian (mặc dù dưới mui xe là ns từ 1970-1-1).

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

Để chuyển đổi một Timestamp/datetime64 sử dụng cột tz_convert (nếu là tz ngây thơ, tức là không có một múi giờ nào, bạn sẽ cần phải tz_localize đầu tiên):

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') 

Xem số time-zone-handling section of the docs.

Các vấn đề liên quan