我有一列时间戳需要转换为句点('月')。例如
1985-12-31 00:00:00 to 1985-12
Pandas有一个.to_period函数,但它只适用于时间戳索引,而不适用于列。那么你只能有一个句点索引,而不是一个句号列?
只有时间戳是唯一的索引才有效。也就是说,如果时间戳是multIndex的一部分,那么.to_period()函数也不起作用。
似乎Pandas假设人们总是使用时间戳和句点作为索引,但不是单个列,显然不是这样。
无论如何我可以解决这个问题?或者如果不是在熊猫中,它可以在numpy中完成吗?
谢谢!
答案 0 :(得分:24)
今天我遇到了这个帖子,经过进一步挖掘后发现Pandas .15提供了一个更简单的选项使用.dt,你可以避免创建索引并直接创建列的步骤。您可以使用以下内容获得相同的结果:
df[1] = df[0].dt.to_period('M')
答案 1 :(得分: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的一部分,你可以通过提取“column”并将其传递给上面的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