Преобразовать столбец фрейма данных в datetime, только если длина строки не равна нулю

#python #python-3.x #pandas #dataframe #python-datetime

#python #python-3.x #pandas #фрейм данных #python-datetime

Вопрос:

Я хотел бы преобразовать столбец dataframe, который содержит строку даты. Но в некоторых случаях строка даты может быть пустой из-за определенных условий. Итак, я просто хочу, чтобы все остальные строки в этом столбце были преобразованы в формат datetime, за исключением строк в этом конкретном столбце, которые могут быть пустыми. Возможно ли это?

Что я пробовал до сих пор:

Вариант 1:

 df['etime'] = pd.to_datetime(df['etime'],errors='ignore').dt.strftime('%Y-%m-%d %H:%M')
  

Вариант 2:

     for ind in df.index:
        if (df['etime'].str.len()[ind] == 0) :
            df.loc[ind, 'etime'] = "----"
        else:
           df.loc[ind, 'etime'] = <need to convert this row to datetime>

  

Пожалуйста, предоставьте свои предложения.

Пример фрейма данных:

 data = pd.DataFrame({

    'day' : [15, 17, 20, 14, 25],

    'etime': ["20200811235205", "", "20200811215205", "20200811225205", "20200811235203"]

})
  

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

1. показать данные в dataframe

2. что pd.to_datetime(df['etime'],errors='ignore') делает?

3. @Manakin — > Он просто преобразует в datetime соответствующие строки, но не выполняет форматирование «%Y-%m-%d %H:%M»

Ответ №1:

Два шага:

Сначала давайте создадим ряд с вашими datetimes и принудительно введем неверные значения в NaTs :

 s = pd.to_datetime(data['etime'],errors='coerce',format='%Y%m%d%H%M%S')
  

Во-вторых, давайте найдем любые значения, которые не являются NaT и заменим их вашим целевым форматированием:

 data.loc[~s.isna(),'etime'] = s.dt.strftime('%Y-%m-%d %H:%M')

   day             etime
0   15  2020-08-11 23:52
1   17                  
2   20  2020-08-11 21:52
3   14    20200811265205
4   25  2020-08-11 23:52
  
  • предполагая, что 26 — это опечатка в вашем часовом столбце с индексом 3.

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

1. Спасибо @manakin, Да, индекс 3 был опечаткой, сейчас я это исправил.

Ответ №2:

Вы можете попробовать что-то вроде:

 df["etime"] =  df["etime"].apply(lambda x: pd.to_datetime(x,errors='ignore').strftime('%Y-%m-%d %H:%M') if len(x) !=0 else "----")
  

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

1. Попробовал это, это выдает ошибку ===> ‘AttributeError: объект ‘str’ не имеет атрибута ‘str’

2. Попробуйте сейчас, без данных я не смогу это протестировать.