Pandas MulitIndex强制Datetime.date对象为Timestamp对象

时间:2014-11-13 12:13:05

标签: datetime pandas timestamp

我最近更新了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对象。

2 个答案:

答案 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应该只设置索引而不改变它。

我们不需要时间组件。如果我们想通过使用时间戳加快速度并提高效率,我们应该可以选择它。

当操作表时,它会破坏索引在列和索引之间来回转换的所有代码(旋转等,因为它执行静默类型转换)。还打破了与我们无法控制的其他应用程序和代码的交互。

相关问题