使用 MultiIndex 时如何将此 Pandas 列类型保留为日期时间?
How can I keep this Pandas column type as datetime when using MultiIndex?
这太奇怪了,老实说,我想知道我是否只是误解了事情。
我有一些代码可以从日期时间值构建多索引,但在生成多索引后,类型已更改为时间戳。 我希望它保留日期时间。我为什么要关心?好吧,代码的另一部分以与相同日期时间略有不同的方式生成多索引,但在那种情况下它保留 datettime 类型 - 所以我不能在两个 DataFrame 之间使用更新,因为列不被视为相等(是的,我通过直接比较值进行了检查)。
关于最小代码示例:
import datetime
import pandas as pd
import numpy as np
iterables = [['bar', 'baz', 'foo', 'qux'], [datetime.date(2014, 10, 3)]]
columns = pd.MultiIndex.from_product(iterables)
df = pd.DataFrame(np.random.randn(4, 4),columns = columns)
这给出:
>>> df.columns[0]
('bar', Timestamp('2014-10-03 00:00:00'))
请注意日期的类型现在是时间戳,而不是日期时间。在我的代码的另一部分,它保持 datettime(这是正确的事件链,是吗?)所以现在它们都引用相同的日期但测试不相等所以我不能应用 DataFrame.update 来推送数据从一个到另一个。不幸的是,这两条路径都有很强的数据驱动原因,为什么它们应该按现在的方式完成。
想到任何解决方法或解决方案吗?还是我错过了一些明显的东西并且整个前提很愚蠢(我不会在这里以某种方式将其视为一种可能性 - 我很惊讶日期时间测试不等于时间戳)?有没有一种简单的方法可以进入并更改多索引的 二级 类型以将其改回日期时间?
编辑:差点忘了:pandas 版本 0.15.2
在构造一个MultiIndex
,values get changed into Categoricals
.
Categoricals
共 datetimes
automatically get converted to Timestamps
:
In [287]: pd.Categorical([datetime.date(2014, 10, 3)])[0]
Out[287]: Timestamp('2014-10-03 00:00:00')
但是 Categorical
of an Index
does not:
In [288]: pd.Categorical(pd.Index([datetime.date(2014, 10, 3)]))[0]
Out[288]: datetime.date(2014, 10, 3)
因此,
import datetime
import pandas as pd
iterables = [['bar', 'baz', 'foo', 'qux'], pd.Index([datetime.date(2014, 10, 3)])]
columns = pd.MultiIndex.from_product(iterables)
df = pd.DataFrame(np.random.randn(4, 4),columns=columns)
print(df.columns[0])
产量
('bar', datetime.date(2014, 10, 3))
请注意,我知道更改 DataFrame 的 MultiIndex 的最简单方法是重新分配一个新的 MultiIndex。因此,如果 df
已经有一个带时间戳的 MultiIndex,要将 MultiIndex 转换为日期时间,请使用:
iterables = [['bar', 'baz', 'foo', 'qux'], pd.Index([datetime.date(2014, 10, 3)])]
columns = pd.MultiIndex.from_product(iterables)
df.columns = columns
这太奇怪了,老实说,我想知道我是否只是误解了事情。
我有一些代码可以从日期时间值构建多索引,但在生成多索引后,类型已更改为时间戳。 我希望它保留日期时间。我为什么要关心?好吧,代码的另一部分以与相同日期时间略有不同的方式生成多索引,但在那种情况下它保留 datettime 类型 - 所以我不能在两个 DataFrame 之间使用更新,因为列不被视为相等(是的,我通过直接比较值进行了检查)。
关于最小代码示例:
import datetime
import pandas as pd
import numpy as np
iterables = [['bar', 'baz', 'foo', 'qux'], [datetime.date(2014, 10, 3)]]
columns = pd.MultiIndex.from_product(iterables)
df = pd.DataFrame(np.random.randn(4, 4),columns = columns)
这给出:
>>> df.columns[0]
('bar', Timestamp('2014-10-03 00:00:00'))
请注意日期的类型现在是时间戳,而不是日期时间。在我的代码的另一部分,它保持 datettime(这是正确的事件链,是吗?)所以现在它们都引用相同的日期但测试不相等所以我不能应用 DataFrame.update 来推送数据从一个到另一个。不幸的是,这两条路径都有很强的数据驱动原因,为什么它们应该按现在的方式完成。
想到任何解决方法或解决方案吗?还是我错过了一些明显的东西并且整个前提很愚蠢(我不会在这里以某种方式将其视为一种可能性 - 我很惊讶日期时间测试不等于时间戳)?有没有一种简单的方法可以进入并更改多索引的 二级 类型以将其改回日期时间?
编辑:差点忘了:pandas 版本 0.15.2
在构造一个MultiIndex
,values get changed into Categoricals
.
Categoricals
共 datetimes
automatically get converted to Timestamps
:
In [287]: pd.Categorical([datetime.date(2014, 10, 3)])[0]
Out[287]: Timestamp('2014-10-03 00:00:00')
但是 Categorical
of an Index
does not:
In [288]: pd.Categorical(pd.Index([datetime.date(2014, 10, 3)]))[0]
Out[288]: datetime.date(2014, 10, 3)
因此,
import datetime
import pandas as pd
iterables = [['bar', 'baz', 'foo', 'qux'], pd.Index([datetime.date(2014, 10, 3)])]
columns = pd.MultiIndex.from_product(iterables)
df = pd.DataFrame(np.random.randn(4, 4),columns=columns)
print(df.columns[0])
产量
('bar', datetime.date(2014, 10, 3))
请注意,我知道更改 DataFrame 的 MultiIndex 的最简单方法是重新分配一个新的 MultiIndex。因此,如果 df
已经有一个带时间戳的 MultiIndex,要将 MultiIndex 转换为日期时间,请使用:
iterables = [['bar', 'baz', 'foo', 'qux'], pd.Index([datetime.date(2014, 10, 3)])]
columns = pd.MultiIndex.from_product(iterables)
df.columns = columns