2017-09-15 67 views
0

我有以下数据框:天。减去

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

我知道想每个。减去日起10日内,但仅限于那些比2014年三月的结果应该更小的日期像这样:

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

我试过下面的命令,但它根本不改变列。有人知道我在这里做错了吗?

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") 

,如果我只是运行此命令:

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

它正确地给我的数据框过滤的中减去日期。但是,我不知道如何将这些映射回到过滤的原始日期列以替换未减去的日期。

回答

3

您可以使用Series.where

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 

或者使用loc布尔索引分配

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