Серия Pandas: Decrement DateTime на 100 лет - PullRequest
2 голосов
/ 26 июня 2019

У меня есть серия панд следующим образом ...

0  2039-03-16 
1  2056-01-21 
2  2051-11-18 
3  2064-03-05 
4  2048-06-05

Name: BIRTH, dtype: datetime64

Он был создан из строковых данных следующим образом

s = data['BIRTH']
s = pd.to_datetime(s)
s

Я хочу преобразовать все даты после 2040 года в 1940

Я могу сделать это для отдельной записи следующим образом

s.iloc[0].replace(year=d.year-100)

но я действительно хочу просто запустить его на протяжении всей серии. Я не могу решить это. Помогите! ??

PS - Я знаю, что за пределами панд есть способы использования DT модуля Python, но я хотел бы узнать, как это сделать в Pandas, пожалуйста

1 Ответ

2 голосов
/ 26 июня 2019

Использование DateOffset является очевидным выбором здесь:

df['date'] - pd.offsets.DateOffset(years=100)

0   1939-03-16
1   1956-01-21
2   1951-11-18
3   1964-03-05
4   1948-06-05
Name: date, dtype: datetime64[ns]

Назначить его обратно:

df['date'] -= pd.offsets.DateOffset(years=100)
df
        date
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05

У нас есть модуль offsets, чтобы иметь делос нефиксированными частотами это пригодится в подобных ситуациях.


Чтобы исправить свой код, вы хотели бы применить datetime.replace по строкам, используя apply (не рекомендуется):

df['date'].apply(lambda x: x.replace(year=x.year-100))

0   1939-03-16
1   1956-01-21
2   1951-11-18
3   1964-03-05
4   1948-06-05
Name: date, dtype: datetime64[ns]

Или используя понимание списка,

df.assign(date=[x.replace(year=x.year-100) for x in df['date']])

        date
0 1939-03-16
1 1956-01-21
2 1951-11-18
3 1964-03-05
4 1948-06-05

Ни одна из этих записей не очень хорошо справляется с NaT.

...