将一列时间戳转换为 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 中的句点的主要内容,如果未能解决你的问题,请参考以下文章

将一列字符串转换为熊猫列表

Hive日期格式转换详解(包含13位时间戳转毫秒时间)

Spark:考虑夏令时将 GMT 时间戳转换为东部时间

js把时间戳只转换为“时“和”分”

SQLServer时间戳转日期格式(13位时间戳)

js页面里时间戳转日期