将一列时间戳转换为pandas中的句点

时间:2014-05-24 02:37:09

标签: python datetime numpy pandas

我有一列时间戳需要转换为句点('月')。例如

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

Pandas有一个.to_period函数,但它只适用于时间戳索引,而不适用于列。那么你只能有一个句点索引,而不是一个句号列?

只有时间戳是唯一的索引才有效。也就是说,如果时间戳是multIndex的一部分,那么.to_period()函数也不起作用。

似乎Pandas假设人们总是使用时间戳和句点作为索引,但不是单个列,显然不是这样。

无论如何我可以解决这个问题?或者如果不是在熊猫中,它可以在numpy中完成吗?

谢谢!

2 个答案:

答案 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