将pandas(multi)索引解析为datetime

时间:2017-07-21 17:18:11

标签: python pandas

我有多索引df如下

                x  y
id  date            
abc 3/1/1994  100  7
    9/1/1994   90  8
    3/1/1995   80  9

将日期存储为str。

我想解析日期索引。以下陈述

df.index.levels[1] = pd.to_datetime(df.index.levels[1])

返回错误:

TypeError: 'FrozenList' does not support mutable operations.

3 个答案:

答案 0 :(得分:7)

如上所述,您必须重新创建索引:

df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])])

答案 1 :(得分:1)

您无法就地修改它。您可以使用pandas.MultiIndex.map创建新索引,然后分配它:

new_tuples = df.index.map(lambda x: (x[0], pd.to_datetime(x[1])))
df.index = pd.MultiIndex.from_tuples(new_tuples, names=["id", "date"])

答案 2 :(得分:0)

无法就地修改MultiIndex,因此我们必须重新创建它。为此,我们使用get_level_values获取多引号级别Series,然后应用pd.to_datefime,然后从两个级别重建多索引。

index = pd.MultiIndex.from_tuples([('abc', '3/1/1994'), ('abc', '9/1/1994')],
                                 names=('id', 'date'))
df = pd.DataFrame({'x': [1, 2]}, index=index)
print(df.index.get_level_values(level=1).dtype)
# object

df.index = pd.MultiIndex.from_arrays([index.get_level_values(level=0),
                                      pd.to_datetime(
                                          index.get_level_values(level=1))])
print(df.index.get_level_values(level=1).dtype)
# datetime64[ns]