Python Pandas 按组删除 DateTime 列

1 投票
2 回答
1355 浏览
提问于 2025-04-20 03:04

我在使用groupby.median()和groupby.mean()的时候遇到了一些麻烦,数据框里有一些间歇性的NaT值。具体来说,我的数据集中有几列是根据其他列计算时间差的。在某些情况下,没有时间差,这就导致出现了NaT值,像下面这个例子:

Group    Category    Start Time      End Time      Time Diff
  A         1        08:00:00.000    08:00:00.500      .500
  B         1        09:00:00.000    09:02:00.000  2:00.000
  B         1        09:00:00.000      NaT           NaT
  A         2        09:00:00.000    09:02:00.000  2:00.000
  A         2        09:00:00.000    09:01:00.000  1:00.000
  A         2        08:00:00.000    08:00:01.500     1.500

每次我运行 df.groupby(['Group', 'Category']).median().mean() 时,任何包含NaT的列都会从结果中被删除。我尝试过用 fillna 来填补这些值,但NaT似乎还是留在那儿。补充一下,这个脚本在旧版本的Anaconda Python(1.x)中运行得很好。最近我把工作电脑升级到了2.0.1,从那时起这个问题就开始出现了。

补充说明:我会把我对NaT的看法放在上面,以防它们是个因素,但经过进一步检查,我发现我的问题实际上在于这些列是timedelta64类型的。有没有人知道有什么方法可以在timedelta上计算平均值或中位数?

非常感谢你们的任何见解!

2 个回答

0

对于其他来到这里的人,这个问题似乎在Pandas的1.3.4版本和2.2.0版本之间被修复了(这两个版本我方便测试),但我不确定具体是什么时候修复的,也不知道是怎么修复的,以上的PR里也没有提到。

所以,如果可以的话,更新你的Pandas版本,这样应该就能解决这个问题。

如果有人知道具体的修复时间,可以在这里写一下,以便将来参考吗?

1

经过一些进一步的搜索和实验,我确认这个问题似乎和那些 timedelta64 类型的列有关。为了在这些列上使用 pd.groupby,我首先把它们转换成浮点数,方法如下:

df['结束时间'] = df['结束时间'].astype('timedelta64[ms]') / 86400000

可能还有更优雅的解决方案,但这个方法让我能够继续进行我的分析。

谢谢!

撰写回答