2017-02-16 1 views
1

Ich bin in ein seltsames Verhalten versucht versuchen, Zeilen eines Pandas Datenrahmens nach ID und dann Auswahl von max/min Datumsangaben (w/Zeitzonen). Dies ist mit Pandas 0.18.1 und numpy 1.11.1 (Ich sah in früheren Posts ein ähnliches Problem wurde anscheinend mit Pandas 0,15 behoben).Ungerade Zeitzone Verhalten mit groupby/agg in Pandas

Insbesondere dann, wenn ich versuche:

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

ich:

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] 

Wo die Rohdaten hatte mal näher an 08.00 Uhr (US/Eastern). Mit anderen Worten, es wurde auf UTC-Zeiten zurückgesetzt, obwohl es sagt, dass es östliche Zeiten sind und UTC-4-Offset hat.

Aber wenn ich stattdessen versuchen:

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

ich jetzt:

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] 

, die das Verhalten, das ich gedacht. Diese zweite Methode ist erheblich langsamer, und ich hätte angenommen, dass die beiden Ansätze identische Ergebnisse liefern würden ...

+0

sieht aus wie ein Fehler sein sollte, können Sie überprüfen, ob dies bereits berichtet wurde auf https://github.com/pandas- dev/pandas/issues und wenn nicht, poste ein neues Problem – EdChum

Antwort

0

Ich kann dieses Verhalten bestätigen. Das Problem ist in pandas/types/cast/_possibly_downcast_to_dtype(). Die Berechnungen werden als i8 ausgeführt und anschließend in eine Zeitzonenerkennung datetime zurückverwandelt. Aber diese Linie:

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

muss dies sein:

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

Update:

Ich habe eine PR vorgelegt dieses Problem zu beheben.

Update 2:

PR merged war und in 0.20.0

Verwandte Themen