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



我遇到了一些奇怪的行为,试图通过ID分组PANDAS DataFrame的行,然后选择Max/Min DateTimes(W/TimeZones)。这是熊猫0.18.1和numpy 1.11.1(我在较早的帖子中看到类似的问题显然是固定的,w/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-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完成的,然后将其转换为时区Aware datetime。但是这条线:

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

需要这样:

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

更新:

我提交了PR来解决此问题。

更新2:

PR已合并,应在0.20.0

相关内容

  • 没有找到相关文章

最新更新