2015-07-01 21 views
9

Mam kolumny datetime jak poniżej -odjąć lat z kolumny datetime w pand

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

Teraz chcę odjąć lat z każdym wierszu tej kolumny. Jak mogę uzyskać tę samą bibliotekę, której mogę użyć?

Oczekiwany field -

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

Dzięki.

Odpowiedz

23

Można użyć DateOffset, aby to osiągnąć:

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 
+3

Jestem ciekaw, co robi, gdy datę początkową jest 29 lutego? –

+0

@MarkRansom dobre pytanie Właśnie próbowałem tego, dla '2004-02-29' odjęcie roku staje się' 2003-02-28' – EdChum

8

Można użyć pd.Timedelta:

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

Albo wymienić:

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

Ale ani przestępne złapie roku więc można używać dateutil.relativedelta:

from dateutil.relativedelta import relativedelta 

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

Zastosowanie 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 
+0

Co ty tutaj robisz? ;) – IanS

+0

To dupe, więc dodaj kolejne rozwiązanie;) Dzięki. – jezrael

+1

To powinna być zaakceptowana odpowiedź, ponieważ używa wektoryzacji – user32185

Powiązane problemy