【问题标题】:Pandas: convert timeseries columns to multi-index with DatetimeIndexPandas:使用 DatetimeIndex 将时间序列列转换为多索引
【发布时间】:2020-08-06 04:28:27
【问题描述】:

我有一个时间序列的 csv 文件/数据框,如下所示:

IDX_A   IDX_B   1/1/20  1/2/20  1/3/20
A       1       A1_0    A1_1    A1_2
A       2       A2_0    A2_1    A2_2
B       3       B3_0    B3_1    B3_2
B       4       B4_0    B3_1    B3_2

我想转换为第一级为 DatetimeIndex 的多索引:

                        F1
Date    IDX_A   IDX_B
1/1/20  A       1       A1_0
                2       A2_0
        B       3       B3_0
                4       B4_0
1/2/20  A       1       A1_1
                2       A2_1
        B       3       B3_1
                4       B3_1
1/3/20  A       1       A1_2
                2       A2_2
        B       3       B3_2
                4       B3_2

我认为以前有人问过这个问题,但我只能找到有关单个索引的另一个方向的信息。我将附加额外的特征列并在现有代码中使用,所以这对我来说是最好的格式,特别是考虑到 DatetimeIndex 对于时间序列有意义。

【问题讨论】:

    标签: pandas time-series multi-index reindex datetimeindex


    【解决方案1】:

    我的做法:

    (df.set_index(['IDX_A','IDX_B'])
       .rename_axis(columns='Date')
       .stack()
       .reorder_levels((2,0,1))
       .sort_index()
       .to_frame(name='F1')
    )
    

    或者使用melt:

    (df.melt(['IDX_A','IDX_B'], var_name='Date',value_name='F1')
       .set_index(['Date','IDX_A','IDX_B'])
    )
    

    输出:

                          F1
    Date   IDX_A IDX_B      
    1/1/20 A     1      A1_0
                 2      A2_0
           B     3      B3_0
                 4      B4_0
    1/2/20 A     1      A1_1
                 2      A2_1
           B     3      B3_1
                 4      B3_1
    1/3/20 A     1      A1_2
                 2      A2_2
           B     3      B3_2
                 4      B3_2
    

    【讨论】:

    • 谢谢,对于这个和我更复杂的真实数据来说,melt 非常有效!我会注意任何来这里以确保 csv 加载了 parse_dates=True 的人,我在第一次尝试你的答案时忘记了这一点。
    猜你喜欢
    • 2021-05-03
    • 2021-12-17
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多