这很奇怪我真的很想知道我是不是只是误解了事情。
我有一些代码可以从datetime值构建多索引,但在生成多索引后,类型已更改为Timestamp。 我希望保持日期时间。我为什么要关心?好吧,代码的另一部分以相同的日期时间略有不同的方式生成多索引但在这种情况下它保留了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从一个推送数据到另一个。不幸的是,这两条路径都有很强的数据驱动原因,为什么它们应该以它们的方式完成。
任何解决方法或解决方案都会浮现在脑海中?或者我错过了一些明显的东西,整个前提是愚蠢的(我不会在这里以某种方式折扣 - 我很惊讶日期时间测试不等于时间戳)?是否有一种简单的方法可以覆盖并更改多索引的二级类型,以便将它们更改回日期时间?
编辑:差点忘了:熊猫版本0.15.2
答案 0 :(得分:2)
构建MultiIndex
,values get changed into Categoricals
。
Categoricals
automatically get converted to Timestamps
的 datetimes
:
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