将一列时间戳转换为 pandas 中的句点
Posted
技术标签:
【中文标题】将一列时间戳转换为 pandas 中的句点【英文标题】:Convert a column of timestamps into periods in pandas 【发布时间】:2014-07-13 11:54:33 【问题描述】:我有一列时间戳需要转换为句点(“月”)。例如
1985-12-31 00:00:00 to 1985-12
Pandas 有一个 .to_period 函数,但它只适用于时间戳索引,而不适用于列。所以只能有句号索引,不能有句号列?
只有当时间戳是唯一的索引时它才有效。也就是说,如果时间戳是 multIndex 的一部分,则 .to_period() 函数也不起作用。
似乎 Pandas 假设人们将始终使用时间戳和句点作为索引,而不是单个列,显然情况并非如此。
无论如何我可以解决这个问题?或者如果不在 Pandas 中,是否可以在 numpy 中完成?
谢谢!
【问题讨论】:
【参考方案1】:你是对的,你需要做这一个 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
【讨论】:
您能否举一个从 multiIndex 中提取 level=1 索引作为列的示例? pandas.pydata.org/pandas-docs/stable/… 即df.index.get_level_values(1)
,如果这是日期,这似乎返回一个 DatetimeIndex。
iirc 这应该在 master / 0.14.0 中工作并保持 periodindex
谢谢@AndyHayden。是否可以将 MultIndex 中的时间戳索引直接更改为周期索引?
@user3576212 好问题,我不认为这样,因为 0.13 (?) 这些是用 FrozenLists 实现的,所以更难改变标签:s 肯定会很高兴为这类东西提供更多 API...【参考方案2】:
我今天遇到了这个帖子,进一步挖掘后发现Pandas .15提供了一个更简单的选项使用.dt,您可以避免创建索引并直接创建列的步骤。您可以使用以下方法获得相同的结果:
df[1] = df[0].dt.to_period('M')
【讨论】:
这不起作用:'DatetimeProperties' 对象没有属性 'to_priod' @AliKhosro 将“to_priod”更改为“to_period”以上是关于将一列时间戳转换为 pandas 中的句点的主要内容,如果未能解决你的问题,请参考以下文章