web-dev-qa-db-fra.com

Soustrayez une année d'une colonne datetime dans pandas

J'ai une colonne datetime comme ci-dessous -

>>> df['ACC_DATE'].head(2)
538   2006-04-07
550   2006-04-12
Name: ACC_DATE, dtype: datetime64[ns]

Maintenant, je veux soustraire une année de chaque ligne de cette colonne. Comment puis-je obtenir la même chose et quelle bibliothèque puis-je utiliser?

Le champ attendu -

        ACC_DATE    NEW_DATE
538   2006-04-07  2005-04-07
549   2006-04-12  2005-04-12

Merci.

24
0nir

Vous pouvez utiliser DateOffset pour y parvenir:

In [15]:    
df['NEW_DATE'] = df['ACC_DATE'].apply(lambda x: x - pd.DateOffset(years=1))
df

Out[15]:
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12

mise à jour

Il n'est pas nécessaire de regarder cette question 3 ans plus tard en utilisant apply:

In[88]:
df['NEW_DATE'] = df['ACC_DATE'] - pd.DateOffset(years=1)
df

Out[88]: 
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12

qui est une opération vectorisée

53
EdChum

Vous pouvez utiliser pd.Timedelta:

df["NEW_DATE"] = df["ACC_DATE"] - pd.Timedelta(days=365) 

Ou remplacez:

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x.replace(year=x.year - 1))

Mais ni l'un ni l'autre n'attraperont les années bissextiles, vous pouvez donc utiliser dateutil.relativedelta:

from dateutil.relativedelta import  relativedelta

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x - relativedelta(years=1))
10
Padraic Cunningham

Utilisez DateOffset :

df["NEW_DATE"] = df["ACC_DATE"] - pd.offsets.DateOffset(years=1)
print (df)
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12
10
jezrael