2013-10-03 51 views
1

我有兩列的數據幀時間戳使用DateTimeIndex:轉換多個列與時間戳值到GMT時間,而不在熊貓

In [12]: df = pd.DataFrame({"start_time": range(1380805471, 1380805481), "end_time" : range(1380805481, 1380805491)}) 

In [13]: df.ix[:,['start_time','end_time']] 
Out[13]: 
    start_time end_time 
0 1380805471 1380805481 
1 1380805472 1380805482 
2 1380805473 1380805483 
3 1380805474 1380805484 
4 1380805475 1380805485 
5 1380805476 1380805486 
6 1380805477 1380805487 
7 1380805478 1380805488 
8 1380805479 1380805489 
9 1380805480 1380805490 

第二步只是使得START_TIME被END_TIME否則之前顯示列僅按字母順序顯示,只有df

現在,我想將這些時間戳轉換爲人類可讀的時間來顯示。目前,我做::

In [15]: import datetime as dt 

In [16]: df['start_time'] = [dt.datetime.fromtimestamp(t) for t in df.start_time] 

In [17]: df['end_time'] = [dt.datetime.fromtimestamp(t) for t in df.end_time] 

In [18]: df.ix[:,['start_time','end_time']] 
Out[18]: 
      start_time   end_time 
0 2013-10-03 18:34:31 2013-10-03 18:34:41 
1 2013-10-03 18:34:32 2013-10-03 18:34:42 
2 2013-10-03 18:34:33 2013-10-03 18:34:43 
3 2013-10-03 18:34:34 2013-10-03 18:34:44 
4 2013-10-03 18:34:35 2013-10-03 18:34:45 
5 2013-10-03 18:34:36 2013-10-03 18:34:46 
6 2013-10-03 18:34:37 2013-10-03 18:34:47 
7 2013-10-03 18:34:38 2013-10-03 18:34:48 
8 2013-10-03 18:34:39 2013-10-03 18:34:49 
9 2013-10-03 18:34:40 2013-10-03 18:34:50 

我的問題 - 有沒有熊貓這樣做,它不需要使用列表理解或這是唯一的方法的具體方法是什麼?

我知道,處理時間戳的另一種方法是使用DateTimeIndex,然後使用本地化方法將其轉換爲所需的時區。但是這種方式要求您將列設置爲索引,因此只能爲一列完成。如果我對DateTimeIndex的理解錯誤,請糾正我。另外,我不需要這些列作爲索引。

那麼有沒有更好的方法來做到這一點使用熊貓?

UPDATE

In [52]: df['start_time'] = pd.DatetimeIndex(pd.to_datetime(df['start_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata') 

In [53]: df 
Out[53]: 
    end_time   start_time 
0 1380805481 2013-10-03 13:04:31 
1 1380805482 2013-10-03 13:04:32 
2 1380805483 2013-10-03 13:04:33 
3 1380805484 2013-10-03 13:04:34 
4 1380805485 2013-10-03 13:04:35 
5 1380805486 2013-10-03 13:04:36 
6 1380805487 2013-10-03 13:04:37 
7 1380805488 2013-10-03 13:04:38 
8 1380805489 2013-10-03 13:04:39 
9 1380805490 2013-10-03 13:04:40 

它仍然呈現,而我想GMT + 5.30,甚至要指定 '亞洲/加爾各答' 的說法後GMT時間。我錯過了什麼嗎?

我需要轉換兩列以在本地時區顯示時間。如果我將它設置爲索引,DateTimeIndex的結果纔可見。

In [55]: t = pd.DatetimeIndex(pd.to_datetime(df['start_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata') 

In [59]: df.set_index(t, inplace=True) 

In [60]: df 
Out[60]: 
          end_time   start_time 
2013-10-03 18:34:31+05:30 1380805481 2013-10-03 13:04:31 
2013-10-03 18:34:32+05:30 1380805482 2013-10-03 13:04:32 
2013-10-03 18:34:33+05:30 1380805483 2013-10-03 13:04:33 
2013-10-03 18:34:34+05:30 1380805484 2013-10-03 13:04:34 
2013-10-03 18:34:35+05:30 1380805485 2013-10-03 13:04:35 
2013-10-03 18:34:36+05:30 1380805486 2013-10-03 13:04:36 
2013-10-03 18:34:37+05:30 1380805487 2013-10-03 13:04:37 
2013-10-03 18:34:38+05:30 1380805488 2013-10-03 13:04:38 
2013-10-03 18:34:39+05:30 1380805489 2013-10-03 13:04:39 
2013-10-03 18:34:40+05:30 1380805490 2013-10-03 13:04:40 

我該怎麼做這兩列?

+1

你可以只用'apply'和直接分配給列像這樣'DF [ 'START_TIME'] = DF [ 'START_TIME']適用。(拉姆達X:dt.datetime.fromtimestamp(X)) ',這比列表理解更好 – EdChum

回答

4

這是在0.12推出什麼。在Cython中完成的速度要快得多。單位 是紀元秒數(如果你的日期時間以毫秒爲單位,你也可以傳遞例如'ms')。 docs here

In [6]: df['end_time'] = pd.to_datetime(df['end_time'],unit='s') 

In [7]: df['start_time'] = pd.to_datetime(df['end_time'],unit='s') 

In [8]: df 
Out[8]: 
      end_time   start_time 
0 2013-10-03 13:04:41 2013-10-03 13:04:41 
1 2013-10-03 13:04:42 2013-10-03 13:04:42 
2 2013-10-03 13:04:43 2013-10-03 13:04:43 
3 2013-10-03 13:04:44 2013-10-03 13:04:44 
4 2013-10-03 13:04:45 2013-10-03 13:04:45 
5 2013-10-03 13:04:46 2013-10-03 13:04:46 
6 2013-10-03 13:04:47 2013-10-03 13:04:47 
7 2013-10-03 13:04:48 2013-10-03 13:04:48 
8 2013-10-03 13:04:49 2013-10-03 13:04:49 
9 2013-10-03 13:04:50 2013-10-03 13:04:50 

注意,這是在格林尼治標準時間了。 datetime.fromtimestamp轉換爲本地tz)。如果你想要的話。

In [21]: DatetimeIndex(pd.to_datetime(df['end_time'],unit='s'),tz='UTC').tz_convert('EST') 
Out[21]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2013-10-03 08:04:41, ..., 2013-10-03 08:04:50] 
Length: 10, Freq: None, Timezone: EST 
In [32]: DataFrame(dict(end_time = DatetimeIndex(pd.to_datetime(df['end_time'],unit='s'),tz='UTC').tz_convert('Asia/Kolkata').asobject)) 

轉換爲亞洲/加爾各答的tz。你必須將其表示爲對象。這是可行的。

    end_time 
0 2013-10-03 18:34:41+05:30 
1 2013-10-03 18:34:42+05:30 
2 2013-10-03 18:34:43+05:30 
3 2013-10-03 18:34:44+05:30 
4 2013-10-03 18:34:45+05:30 
5 2013-10-03 18:34:46+05:30 
6 2013-10-03 18:34:47+05:30 
7 2013-10-03 18:34:48+05:30 
8 2013-10-03 18:34:49+05:30 
9 2013-10-03 18:34:50+05:30 
+0

+1我向你的知識鞠躬:) – EdChum

+0

@Jeff工作正常,但轉換後的時間即使在指定時區作爲參數後也不在本地時區。請參閱上面的更新。 – Geekster

+0

刪除以前的評論。感謝它的工作。 – Geekster

1

使用apply

df['start_time'] = df['start_time'].apply(lambda x: dt.datetime.fromtimestamp(x)) 
df['end_time'] = df['end_time'].apply(lambda x: dt.datetime.fromtimestamp(x)) 

這將實現你想要

+0

這也有幫助。感謝名單! – Geekster