当前位置: 代码迷 >> python >> 在pandas中使用groupby / agg的奇怪时区行为
  详细解决方案

在pandas中使用groupby / agg的奇怪时区行为

热度:100   发布时间:2023-06-16 10:17:35.0

我遇到了一些奇怪的行为,试图按ID对pandas数据帧的行进行分组,然后选择最大/最小日期时间(w / timezones)。 这是大熊猫0.18.1和numpy 1.11.1(我在之前的帖子中看到类似的问题显然已经解决了,并且pandas为0.15)。

具体来说,如果我尝试:

print orders.groupby('OrderID')['start_time'].agg(np.min).iloc[:5]

我明白了:

OrderID
O161101XVS100000044   2016-11-01 12:03:12.920000-04:00
O161101XVS100000047   2016-11-01 12:03:36.693000-04:00
O161101XVS100000098   2016-11-01 12:09:08.330000-04:00
O161101XVS100000122   2016-11-01 12:09:59.950000-04:00
O161101XVS100000152   2016-11-01 12:11:29.790000-04:00
Name: start_time, dtype: datetime64[ns, US/Eastern]

原始数据的时间接近上午8点(美国/东部)。 换句话说,它恢复到UTC时间,即使它说的是东部时间,并且具有UTC-4偏移。

但如果我改为尝试:

print orders.groupby('OrderID')['start_time'].agg(lambda x: np.min(x)).iloc[:5]

我现在得到:

OrderID
O161101XVS100000044   2016-11-01 08:03:12.920000-04:00
O161101XVS100000047   2016-11-01 08:03:36.693000-04:00
O161101XVS100000098   2016-11-01 08:09:08.330000-04:00
O161101XVS100000122   2016-11-01 08:09:59.950000-04:00
O161101XVS100000152   2016-11-01 08:11:29.790000-04:00
Name: start_time, dtype: datetime64[ns, US/Eastern]

这是我想要的行为。 第二种方法速度要慢得多,我认为这两种方法会产生相同的结果......

我可以证实这种行为。 问题出在pandas/types/cast/_possibly_downcast_to_dtype() 计算以i8完成,然后转换回时区感知datetime 但这一行:

result = to_datetime(result).tz_localize(dtype.tz)

需要这样:

result = to_datetime(result).tz_localize('utc')
result = result.tz_convert(dtype.tz)

更新:

我已提交来解决此问题。

更新2:

PR已 ,应该在0.20.0

  相关解决方案