Как обрабатывать несколько временных меток в столбце pandas?

#python #pandas #date #timestamp #format

#python #pandas #Дата #временная метка #формат

Вопрос:

В столбце TS есть обе временные метки, и я понятия не имею, какая временная метка может прийти

 08/06/2020 11:52:07 PM  # this is MM/dd/yyyy HH:mm:ss 


07/08/2020 0:31:17  # this is dd/MM/yyyy HH:mm:ss 
  

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

1. Всегда ли MM/dd/yyyy HH:mm:ss временная метка имеет PM ?

2. ДА. В нем всегда есть AM или PM

Ответ №1:

Поскольку временная метка с форматом MM/dd/yyyy HH:mm:ss всегда содержит либо PM , либо AM вы могли бы определить функцию синтаксического анализа, например:

 import pandas as pd

def parse_dt(sdt):
    if 'AM' in sdt or 'PM' in sdt:
        return pd.to_datetime(sdt)
    else:
        return pd.to_datetime(sdt , dayfirst=True)
  

Обратите внимание, вы также можете определить его с помощью lambda для прямого использования, например read_csv

 lambda dt: pd.to_datetime(sdt) if 'AM' in dt or 'PM' in dt else pd.to_datetime(sdt , dayfirst=True)
  

Тестирование на ваших примерах дает

 >>> parse_dt('08/06/2020 11:52:07 PM')
Timestamp('2020-08-06 23:52:07')
>>> parse_dt('07/08/2020 0:31:17')
Timestamp('2020-08-07 00:31:17')
  

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

1. Это сработало. Теперь мне просто нужно использовать функцию apply для фрейма данных.

2. @AnimeshKansal, я не знаю, как это df выглядит, но вы могли бы сделать что-то вроде df['dt colum'] = df['dt colum'].apply(lambda dt: pd.to_datetime(sdt) if 'AM' in dt or 'PM' in dt else pd.to_datetime(sdt , dayfirst=True)) .

3. Да, я смог это сделать. Большое тебе спасибо, Стефан