我最近更新了Pandas并发现这种奇怪的行为破坏了我现有的一些代码。 我使用一列Datetime.date对象作为两级MulitIndex中的第二级。 但是,在使用最新版本设置索引时,Datetime.date对象将转换为Timestamp对象,并将00:00:00作为时间组件:
>>> pd.__version__
'0.15.1'
>>> df
0 ID date
0 0.486567 10 2014-11-12
1 0.214374 20 2014-11-13
>>> df.date[0]
datetime.date(2014, 11, 12)
>>> df.set_index(['ID', 'date']).index[0]
(10, Timestamp('2014-11-12 00:00:00'))
版本0.14或更早版本不会发生这种情况,对于设置为索引的单个日期列也不会发生这种情况,仅适用于MulitIndices。
有一个黑客可以绕过它,将日期设置为单级索引,添加其他级别然后交换:
>>> df.set_index('date').set_index('ID', append=True).index.swaplevel(0, 1)[0]
(10, datetime.date(2014, 11, 12))
这看起来很奇怪,我想知道它是否有意,是否有正确的方法在新版本中使用datetime.date对象。
答案 0 :(得分:1)
请参阅here
他们在多重索引级别中推断出date-likes(datetime.date,datetime.datetime,Timestamp)的方式不一致。这导致创建了一个对象dtyped Index而不是DatetimeIndex。 datetime.date是pandas中的第二类对象,因为它们没有有效表示。
如果你真的想要创建它,你可以这样做:
In [8]: pd.MultiIndex.from_arrays([Index([datetime.date(2013,1,1)]),['a']])
Out[8]:
MultiIndex(levels=[[2013-01-01], [u'a']],
labels=[[0], [0]])
答案 1 :(得分:0)
我们遇到了同样的问题,它仍然是0.16中的一个问题。我们认为这是一个错误,因为它与创建单个索引的操作不一致,并且只发生在多索引上。如果我们选择将其作为datetime.date,为什么要默默地更改类型? Set_index应该只设置索引而不改变它。
我们不需要时间组件。如果我们想通过使用时间戳加快速度并提高效率,我们应该可以选择它。
当操作表时,它会破坏索引在列和索引之间来回转换的所有代码(旋转等,因为它执行静默类型转换)。还打破了与我们无法控制的其他应用程序和代码的交互。