Создать новый столбец даты в Python Pandas - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать новый столбец даты на основе существующего столбца даты в моем фрейме данных. Я хочу взять все даты в первом столбце и сделать их первыми месяца во втором столбце так:

03/15/2019 = 03/01/2019

Я знаю, что могу сделать это, используя:

df['newcolumn'] = pd.to_datetime(df['oldcolumn'], format='%Y-%m-%d').apply(lambda dt: dt.replace(day=1)).dt.date

У меня проблемы с некоторыми данными в старом столбце недействительных дат. В некоторых строках есть текстовые данные. Итак, я пытаюсь выяснить, как очистить данные, прежде чем сделать это следующим образом:

если oldcolumn не дата, сделайте это 01.01.1990, иначе oldcolumn

Или, есть ли способ сделать это с помощью try / кроме?

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

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Сначала мы генерируем некоторые примеры данных:

df = pd.DataFrame([['2019-01-03'], ['asdf'], ['2019-11-10']], columns=['Date'])

Это можно безопасно преобразовать в datetime

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
mask = df['Date'].isnull()
df.loc[mask, 'Date'] = dt.datetime(1990, 1, 1)

Теперь вам не нужны медленные apply

df['New'] = df['Date'] + pd.offsets.MonthBegin(-1)
0 голосов
/ 13 марта 2019

Попробуйте с аргументом errors=coerce. Это вернет NaT для текстовых значений.

df['newcolumn'] = pd.to_datetime(df['oldcolumn'], 
                                 format='%Y-%m-%d', 
                                 errors='coerce').apply(lambda dt: dt.replace(day=1)).dt.date

Например

# We have this dataframe
    ID        Date
0  111  03/15/2019
1  133  01/01/2019
2  948       Empty
3  452  02/10/2019

# We convert Date column to datetime
df['Date'] = pd.to_datetime(df.Date, format='%m/%d/%Y', errors='coerce')

выход

    ID       Date
0  111 2019-03-15
1  133 2019-01-01
2  948        NaT
3  452 2019-02-10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...