2017-09-15 4 views
0

Ich habe folgende Datenrahmen:Substract Tage in einer gefilterten Zeitreihen Spalte

date   number 
2016-01-20  1 
2016-06-21  1 
2012-05-6  1 

Ich weiß von 10 Tagen jeden Tag subtrahieren wollen, sondern nur jene Daten, die kleiner als Marsch 2014. Das Ergebnis sind aussehen sollte wie folgt:

date   number 
2016-01-10  1 
2016-06-11  1 
2012-05-6   

Ich habe den folgenden Befehl versucht, aber es ändert einfach nicht die Spalte. Weiß jemand, was ich hier falsch mache?

df[df["date"].isin(pd.date_range("2014-02-01", "2018-01-01"))]["date"] = df[df["date"].isin(pd.date_range("2014-02-01", "2018-01-01"))]["date"] - pd.Timedelta(10, "D") 

Wenn ich nur diesen Befehl ausführen:

df[df["date"].isin(pd.date_range("2014-02-01", "2018-01-01"))]["date"] - pd.Timedelta(10, "D") 

Es gibt mir richtig die subtrahierte Daten des gefilterten Datenrahmen. Ich weiß jedoch nicht, wie diese dann wieder auf die gefilterte ursprüngliche Datumsspalte abgebildet werden, um die nicht subtrahierten Daten zu ersetzen.

Antwort

3

können Sie Series.where verwenden:

df.date = df.date.where(df.date < '2014-03-01', df.date - pd.Timedelta(10, 'D')) 
df 
#   date number 
#0 2016-01-10 1 
#1 2016-06-11 1 
#2 2012-05-06 1 

Oder verwenden loc mit boolean Indizierung und Zuordnung:

df.loc[df.date > '2014-03-01', 'date'] -= pd.Timedelta(10, 'D') 

df 
#   date number 
#0 2016-01-10  1 
#1 2016-06-11  1 
#2 2012-05-06  1 
Verwandte Themen