2015-07-01 4 views
9

У меня есть столбец DATETIME, как показано ниже -вычитать год от столбца даты и времени в панд

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

Теперь я хочу, чтобы вычесть год из каждой строки этого столбца. Как я могу достичь того же &, какую библиотеку я могу использовать?

Ожидаемое поле -

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

Спасибо.

ответ

23

Вы можете использовать DateOffset для достижения этой цели:

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

мне очень интересно, что он делает, когда дату начала это 29 февраля? –

+0

@MarkRansom хороший вопрос Я просто попробовал это, для '2004-02-29' вычитание года станет' 2003-02-28' – EdChum

8

Вы можете использовать pd.Timedelta:

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

Или заменить:

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

Но ни поймаешь високосными, чтобы вы могли использовать dateutil.relativedelta:

from dateutil.relativedelta import relativedelta 

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

Использование 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

Что ты здесь делаешь? ;) – IanS

+0

Это ошибка, поэтому добавьте другое решение;) Спасибо. – jezrael

+1

Это должен быть принятый ответ, поскольку он использует векторию – user32185

Смежные вопросы