2017-12-20 7 views
1

Ich habe einen Datenrahmen mit stündlichen Werten während der Arbeitswoche:Verschiebung Teil datetimeindex um 1 Stunde Pandas

>>> vol_adjust.head() 
Out[59]: 
2011-11-01 05:00:00+11:00 3237454603.000 
2011-11-01 06:00:00+11:00 3292278695.000 
2011-11-01 07:00:00+11:00 6037960826.000 
2011-11-01 08:00:00+11:00 7127161746.000 
2011-11-01 09:00:00+11:00 3382477744.000 

>>> vol_adjust.shape 
Out[60]: (29658, 1) 

Das Problem ist, dass einige der Werte auf Samstagen fallen in der Regel nur 1 Wert. Ich habe 5 solche Termine im gesamten Datenrahmen:

>>> vol_adjust[vol_adjust.index.dayofweek == 5] 
Out[63]: 
2012-03-03 00:00:00+11:00 794977434.400 
2012-03-17 00:00:00+11:00 403171073.800 
2013-03-16 00:00:00+11:00 808805223.800 
2014-03-15 00:00:00+11:00 1622434962.000 
2016-03-05 00:00:00+11:00 569319700.900 
Name: vol, dtype: float64 

Bei näherer Betrachtung scheint es, dass in der Woche auf einigen Tagen, die Daten überspringen den 00.00-Eintrag (Mitternacht), z.B.

>>> vol_adjust['2012-03-01'].tail() 
Out[75]: 
2012-03-01 19:00:00+11:00 931207673.400 
2012-03-01 20:00:00+11:00 2213366040.000 
2012-03-01 21:00:00+11:00 994524108.700 
2012-03-01 22:00:00+11:00 541624218.800 
2012-03-01 23:00:00+11:00 2085975988.000 
Name: vol, dtype: float64 
>>> vol_adjust['2012-03-02'].head() 
Out[70]: 
2012-03-02 01:00:00+11:00 1951010063.000 
2012-03-02 02:00:00+11:00 1703256493.000 
2012-03-02 03:00:00+11:00 947991961.000 
2012-03-02 04:00:00+11:00 1210964133.000 
2012-03-02 05:00:00+11:00 908680999.300 
Name: vol, dtype: float64 

Ich habe einen Weg, solche Termine zu identifizieren, und möchte die Stunden um 1 vom Beginn des unruhigen Tages auf den entsprechenden Samstag bis bewegen. Gibt es eine einfache Möglichkeit, dies zu tun? z.B. Nehmen wir an, ich wüsste '2012-03-02' bis '2012-03-03' ist der Zeitraum, in dem der Index um 1 Stunde aus ist, wie kann ich ihn um 1 Stunde einfach nur für diese Zeit verschieben, während der Rest unverändert bleibt ?

Antwort

0

Sie können map über einen Index verwenden und eine lambda-Funktion verwenden. Siehe:

vol_adjust.index = vol_adjust.index.map(lambda x: x + pd.Timedelta(1, 'h') if str(x.date()) in trouble_days else x) 

das heißt unter der Annahme, dass trouble_days in Form von Zeichenketten sind '2012-02-03' sonst können Sie nicht die str(x.date()) Konvertierung benötigen.

Beachten Sie, dass dies um 1h alle Stunden der Tage in troubled_days verschieben würde, die 23 Proben für jeden dieser Tage und 25 Proben für den Tag nach dem unruhigen Tag erstellen würde, da 00:00 01:00 werden würde des nächsten Tages und der Indexeintrag würde wiederholt werden - ich denke du willst das nicht. Aber das können Sie mit etwas komplexerer Logik in der Lambda-Funktion erledigen.

Verwandte Themen