2014-05-24 61 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