【问题标题】:Change item in list to datetime to match MultiIndex columns type将列表中的项目更改为日期时间以匹配 MultiIndex 列类型
【发布时间】:2021-04-16 10:14:57
【问题描述】:

我有带有日期和数字的 MultiIndex,我有带有日期字符串的列表:

df.columns

>>>MultiIndex([(2020-10-22,  7),
            (2020-10-22,  8),
            (2020-10-22,  9),
            (2020-10-22, 10),
            (2020-10-22, 11),
            (2020-10-22, 12),
            (2020-10-22, 13),
            (2020-10-22, 14),
            ...
dts

>>>['2020-10-24',
 '2020-10-24',
 '2020-10-25',
 '2020-10-27',
 '2020-10-27',
 '2020-10-28',
 '2020-10-28',
 '2020-10-28',
 '2020-10-30',
...


hrs

>>>[8,
 9,
 14,
 10,
 13,
 11,
 12,
 13,
 7,
 12,
 7,
 11,
 12,
 7,
...

我希望列表的日期和数据框的类型相同,以便以后可以根据列表中的日期对数据框进行切片(我还有另一个小时列表...)

我试图通过将列表中的日期更改为日期时间来将它们转换为相同的日期:

dts=[datetime.strptime(x,'%Y-%m-%d') for x in dts]

>>>[datetime.datetime(2020, 10, 24, 0, 0),
 datetime.datetime(2020, 10, 24, 0, 0),
 datetime.datetime(2020, 10, 25, 0, 0),
 datetime.datetime(2020, 10, 27, 0, 0),
 datetime.datetime(2020, 10, 27, 0, 0),
 datetime.datetime(2020, 10, 28, 0, 0),
 datetime.datetime(2020, 10, 28, 0, 0),
 datetime.datetime(2020, 10, 28, 0, 0),
...

但是当我尝试根据这些日期对数据框进行切片时,它不起作用,我相信是因为它是不同的类型。

for d,h in zip(dts,hrs):
    date=d
    hour=h
    #print(date,hour)
    idx = pd.IndexSlice
    tmp1 = df.loc[:,idx[date,hour]]
...

---> 12 tmp1 = df.loc[:,idx[date,hour]]

KeyError: (datetime.datetime(2020, 10, 24, 0, 0), 8)

我不确定,但我相信 0,0 是问题所在,但我无法解决。

我的最终目标:能够根据日期和时间从我的数据框中切出正确的列。

编辑:df的列的dtypes:

        Timestamp
2020-10-22  7            float64
            8            float64
            9            float64
                          ...   
2020-11-29  12           float64

编辑 2:

df.index.get_level_values(0).dtype
>>>dtype('int64')

编辑3:

print(df.columns.get_level_values(0)[:4])
>>>Index(['code', 'index', 2020-10-22, 2020-10-22], dtype='object')

print(df.columns.get_level_values(1)[:4])

>>>Index(['', '', 7, 8], dtype='object', name='Timestamp')

【问题讨论】:

    标签: python pandas datetime slice multi-index


    【解决方案1】:

    示例:

    a = ['code', 'index', '2020-10-22', '2020-10-22']
    b = ['', '', 7, 8]
    df = pd.DataFrame(1, index=[0], columns=pd.MultiIndex.from_tuples(zip(a, b)))
    

    首先必须将日期时间列设置为索引:

    df = df.set_index([('code',''),('index','')]).rename_axis(['code','index'])
    print (df)
               2020-10-22   
                        7  8
    code index              
    1    1              1  1
    

    并使用MultiIndex.remove_unused_levels,然后将第一级列转换为日期时间:

    df.columns = df.columns.remove_unused_levels()
    
    df.columns = df.columns.set_levels(pd.to_datetime(df.columns.levels[0]), level=0)
    print (df)
               2020-10-22   
                        7  8
    code index              
    1    1              1  1
    

    现在可以选择了:

    idx = pd.IndexSlice
    print (df.loc[:,idx['2020-10-22',7]])
               2020-10-22
                        7
    code index           
    1    1              1
    

    【讨论】:

    • 然后我得到这个错误: KeyError: ('2020-10-24', 8)
    • @Reut - 你能检查编辑的答案吗?如何将MultiIndex 的第一级转换为日期时间?
    • 我认为multindex的第一级已经是datetime了。它没有改变,我得到同样的错误。我已在原始消息中添加了 dtypes,以便您查看
    • @Reut - 但 MultiIndex 在 df.columns 中,而不是在 df.index 中
    • @Reut - 我改了答案,你能测试一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2015-03-23
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多