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

use*_*212 13 python datetime numpy pandas

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

1985-12-31 00:00:00 to 1985-12
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢!

mat*_*ier 24

我今天遇到了这个帖子,经过进一步挖掘后发现Pandas .15提供了一个更简单的选项使用.dt,你可以避免创建索引并直接创建列的步骤.您可以使用以下内容获得相同的结果:

df[1] = df[0].dt.to_period('M')
Run Code Online (Sandbox Code Playgroud)

  • @AliKhosro 将“to_priod”更改为“to_period” (2认同)

And*_*den 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
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

如果时间戳是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
Run Code Online (Sandbox Code Playgroud)