2014-05-24 59 views
9

我有一列需要轉換爲期間('月')的時間戳。例如將一列時間戳轉換爲熊貓期間

1985-12-31 00:00:00 to 1985-12 

熊貓有一個.to_period函數,但它只適用於時間戳索引,而不是列。所以你只能有一個期間指數,但不能是期限列?

它只有在時間戳是唯一的索引時才起作用。也就是說,如果時間戳是multIndex的一部分,則.to_period()函數也不起作用。

熊貓似乎認爲人們總是會使用時間戳和時間段作爲索引,但不是一列,這顯然不是這種情況。

無論如何,我可以解決這個問題嗎?或者,如果不是在熊貓,它可以做到numpy?

謝謝!

回答

17

我碰到這個線程走到今天,並進一步深挖發現,熊貓0.15得到更容易的選擇使用.DT後,你能避免創建索引的步驟和直接創建列。您可以使用以下方法獲得相同的結果:

df[1] = df[0].dt.to_period('M') 
+0

謝謝,貼子不錯! – user3576212

+0

這不起作用:'DatetimeProperties'對象沒有屬性'to_priod' –

7

你是對的,你需要做一個DatetimeIndex對象而不僅僅是日期時間的列。然而,這是很容易 - 只需將它包裝在一個DatetimeIndex構造:

In [11]: df = pd.DataFrame(pd.date_range('2014-01-01', freq='2w', periods=12)) 

In [12]: df 
Out[12]: 
      0 
0 2014-01-05 
1 2014-01-19 
2 2014-02-02 
3 2014-02-16 
4 2014-03-02 
5 2014-03-16 
6 2014-03-30 
7 2014-04-13 
8 2014-04-27 
9 2014-05-11 
10 2014-05-25 
11 2014-06-08 

In [13]: pd.DatetimeIndex(df[0]).to_period('M') 
Out[13]: 
<class 'pandas.tseries.period.PeriodIndex'> 
freq: M 
[2014-01, ..., 2014-06] 
length: 12 

這是一個PeriodIndex,但你可以把它列:

In [14]: df[1] = pd.DatetimeIndex(df[0]).to_period('M') 

In [15]: df 
Out[15]: 
      0  1 
0 2014-01-05 2014-01 
1 2014-01-19 2014-01 
2 2014-02-02 2014-02 
3 2014-02-16 2014-02 
4 2014-03-02 2014-03 
5 2014-03-16 2014-03 
6 2014-03-30 2014-03 
7 2014-04-13 2014-04 
8 2014-04-27 2014-04 
9 2014-05-11 2014-05 
10 2014-05-25 2014-05 
11 2014-06-08 2014-06 

你可以做一個類似的如果時間戳是MultiIndex的一部分,通過提取「列」 並將它傳遞給DatetimeIndex,如上所示 ,例如使用df.index.get_level_values
例如:

df[2] = 2 
df.set_index([0, 1], inplace=True) 
df.index.get_level_values(0) # returns a DatetimeIndex 
+0

請問您可以舉一個從multiIndex中提取level = 1索引作爲列的示例嗎? – user3576212

+0

http://pandas.pydata.org/pandas-docs/stable/indexing.html#reconstructing-the-level-labels ie'df.index.get_level_values(1)',似乎這返回一個DatetimeIndex,如果這是日期。 –

+0

iirc這應該在主/ 0.14.0工作,並留一段時間索引 – Jeff