当使用多列调用 set_index 时,datetime.date 值将转换为 pd.tslib.Timestamps

When calling set_index with more than one column, datetime.date values are converted to pd.tslib.Timestamps

根据标题,当我执行 set_index 时,pandas 强制将 datetime.date 类型转换为 pd.tslib.Timestamp 类型,但仅当索引。这使得处理和合并不同的帧成为一个问题,因为有些帧以时间戳结束,而另一些则保持为 datetime.dates。超级简单的例子:

df = pd.DataFrame({'date':[datetime.date(2021,3,3),datetime.date(2021,3,4)],'player':['a','b'],'score':[10,9]})

print(type(df['date'][0]))
<class 'datetime.date'>

df = df.set_index('date')

print(type(df.index.get_level_values('date')[0]))
<class 'datetime.date'>

df = df.reset_index()

print(type(df['date'][0]))
<class 'datetime.date'>

df = df.set_index(['date','player'])

print(type(df.index.get_level_values('date')[0]))
<class 'pandas.tslib.Timestamp'>

df = df.reset_index()

print(type(df['date'][0]))
<class 'pandas.tslib.Timestamp'>

如何将它们保存在 datetime.date 中?

[注意:pd.版本 == '0.19.2' 由于遗留代码,如果它是相关的]

我找到了解决方法,但我希望能提供更好的答案,因为这是一种非常低效的方法并且需要很多行。

解决方法:

  1. 将多索引设置为正常
  2. 取消堆叠,直到只有您的日期列仍作为索引
  3. 将值转换回 datetime.dates 并通过列表设置索引,并再次为索引命名
  4. 将 df 堆叠回其原始布局
df = pd.DataFrame({'date':[datetime.date(2021,3,3),datetime.date(2021,3,4)],'player':['a','b'],'score':[10,9]})
df = df.set_index(['date','player'])
df = df.unstack()
df.index = [d.date() for d in df.index.to_pydatetime()]
df.index.names = ['date']
df = df.stack()
print(type(df.index.get_level_values('date')[0]))
<class 'datetime.date'>

我认为这是错误。

您可以使用 MultiIndex.set_levels with set to dates by DatetimeIndex.date:

df = df.set_index(['date','player'])

df.index = df.index.set_levels(df.index.levels[0].date, level=0)

print(type(df.index.get_level_values('date')[0]))
<class 'datetime.date'>

df = df.reset_index()

print(type(df['date'][0]))
<class 'datetime.date'>