【问题标题】:Convert a column of timestamps into periods in pandas将一列时间戳转换为 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 中完成?

谢谢!

【问题讨论】:

    标签: python datetime numpy pandas


    【解决方案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”
    猜你喜欢
    • 2018-10-09
    • 2016-10-05
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2014-12-17
    • 2021-01-18
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多