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)
你是对的,你需要做一个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)