Создать новый столбец даты в python pandas

#python #pandas #date

#python #pandas #Дата

Вопрос:

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

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 / except?

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

Ответ №1:

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

 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)
  

Комментарии:

1. Безусловно, это более элегантное решение, но я бы не назвал apply «медленным», обязательно. Смотрите, например: geeksforgeeks.org /…

Ответ №2:

Попробуйте с аргументом 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
  

Комментарии:

1. Это выглядит как отличное решение, но при попытке его реализации я получаю следующую ошибку: TypeError: to_datetime() получил неожиданный аргумент ключевого слова ‘error’

2. Вы написали ошибку error , вы забыли S, его errors .

3. ах … спасибо за разъяснение и за вашу помощь в целом. очень признателен.