【问题标题】:Date-time column names in pandas熊猫中的日期时间列名称
【发布时间】:2021-12-21 06:33:11
【问题描述】:

我有一个每位客户的使用数据,在几年内每月收集一次,形状为 ~(6000, 60)。

示例数据框:

df = pd.DataFrame({'id': ['user_1', 'user_2'], 'access_type': ['mobile', 'desktop'], '2018-09-01 00:00:00': [7,5], '2018-10-01 00:00:00':[1,3], '2018-11-01 00:00:00':[0,10]})

    id  access_type 2018-09-01 00:00:00 2018-10-01 00:00:00 2018-11-01 00:00:00
0   user_1  mobile  7   1   0
1   user_2  desktop 5   3   10

如何将 40 个选定的日期列更改为日期时间索引 (?) 格式,或允许选择/分割所需时间段作为日期的其他格式?

【问题讨论】:

    标签: python pandas datetime time-series


    【解决方案1】:

    DataFrame.meltDataFrame.set_index 一起使用:

    df2 = (df.melt(['id','access_type'], var_name='date')
            .assign(date = lambda x: pd.to_datetime(x['date']))
            .set_index('date'))
    
    print (df2)
                    id access_type  value
    date                                 
    2018-09-01  user_1      mobile      7
    2018-09-01  user_2     desktop      5
    2018-10-01  user_1      mobile      1
    2018-10-01  user_2     desktop      3
    2018-11-01  user_1      mobile      0
    2018-11-01  user_2     desktop     10
    

    如果需要MultiIndex,请使用set_indexDataFrame.stack

    s = (df.set_index(['id','access_type'])
           .stack()
           .rename(index = lambda x: pd.to_datetime(x), level=2))
    print (s)
    

    或者:

    s = (df.melt(['id','access_type'], var_name='date')
            .assign(date = lambda x: pd.to_datetime(x['date']))
            .set_index(['id','access_type','date'])['value'])
    
    print (s)
    

    【讨论】:

    • 另外,要使用日期时间进行切片,请应用 pd.to_datetime()
    • 谢谢,@jezrael,但第二步 - set_index(...).stack()ParserError: Unknown string format: value 而失败。在此之前,我的输出与您的 df2 中的相同。
    • @ande - 嗯,在 ['id','access_type'] 的列列表中只有 2 个值?然后在.rename(index = lambda x: pd.to_datetime(x), level=2)中使用level=2
    • @jezrael,不,就像您的代码中的 df2 一样,有三列:['id', 'access_type', 'value']。值具有 int 类型。将级别更改为 3 会产生其他类型的错误:IndexError: list index out of range
    • @ande - 所以需要从第一个代码中输出s?答案已编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2016-07-05
    • 2019-07-19
    • 2022-10-12
    • 2020-10-02
    • 2017-02-23
    相关资源
    最近更新 更多