2017-02-16 3 views
1

Я столкнулся с каким-то нечетным поведением, пытающимся сгруппировать строки с помощью фрейма данных pandas по идентификатору, а затем выбирая max/min datetimes (w/timezones). Это с pandas 0.18.1 и numpy 1.11.1 (я видел в предыдущих сообщениях аналогичную проблему, по-видимому, фиксировал w/pandas 0,15).Нечетное поведение часового пояса с использованием groupby/agg in pandas

В частности, если я стараюсь:

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] 

который является поведение я предполагал. Этот второй метод значительно медленнее, и я предположил бы, что два подхода приведут к одинаковым результатам ...

+0

выглядит как ошибка может проверить, если это было сообщено уже https://github.com/pandas- dev/pandas/issues, а если нет, опубликуйте новый номер – EdChum

ответ

0

Я могу подтвердить это поведение. Проблема заключается в 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) 

Update:

Я представил PR для решения этой проблемы.

Update 2:

PR был merged, и должно быть в 0.20.0