Определить формат даты и изменить его на другой - PullRequest
1 голос
/ 18 февраля 2020

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

S. No        DateTime               Area 
1         03/05/2019 6:33            A
2         06/03/2019 07:23:45 AM     B

Первая строка - это формат% m /% d /% Y ч: мм, а вторая строка - это формат% d /% m /% Y чч: мм: сс AM / PM. Первое значение даты может сбить с толку, это 5 марта или 3 мая. Поэтому, чтобы все было в одном формате, я хочу, чтобы мой код обнаруживал формат даты и изменения в нужном формате.

Я попытался сделать это:


df['Detection Date'] = pd.to_datetime(df['Detection Date & Time'], errors = 'coerce').dt.datetime
col = df['Detection Date'].apply(str)


for i in df.index:
    if datetime.datetime.strptime(col, '%m/%d/%Y h:mm'):
       ColDate = datetime.datetime.strftime(col, '%d/%m/%Y hh:mm:ss AM/PM')

Но я получаю ошибка:

TypeError: strptime() argument 1 must be str, not Series

Как это должно быть проведено.

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Если установка зависимостей приемлема, вы можете использовать dateparser link

import pandas as pd 
import dateparser

df = pd.DataFrame({'Detection Date & Time': ['03/05/2019 6:33', '06/03/2019 07:23:45 AM']}) 
df['Date & time'] =  df['Detection Date & Time'].apply(dateparser.parse)
1 голос
/ 18 февраля 2020

Вы можете указать оба возможных значения format s в to_datetime, поэтому, если формат не соответствует, возвращаются пропущенные значения, поэтому возможно использование Series.fillna:

date1 = pd.to_datetime(df['DateTime'], errors = 'coerce', format='%m/%d/%Y %H:%M')
date2 = pd.to_datetime(df['DateTime'], errors = 'coerce', format='%d/%m/%Y %H:%M:%S %p')

df['DateTime'] = date1.fillna(date2)
print (df)
   S. No            DateTime Area
0      1 2019-03-05 06:33:00    A
1      2 2019-03-06 07:23:45    B

Последнее, если хотите указать новый формат добавить Series.dt.strftime - преимущество решения заключается в проверке обоих форматов:

df['DateTime'] = date1.fillna(date2).dt.strftime('%d/%m/%Y %H:%M:%S %p')
print (df)
   S. No                DateTime Area
0      1  05/03/2019 06:33:00 AM    A
1      2  06/03/2019 07:23:45 AM    B

Подробности :

print (date1)
0   2019-03-05 06:33:00
1                   NaT
Name: DateTime, dtype: datetime64[ns]

print (date2)
0                   NaT
1   2019-03-06 07:23:45
Name: DateTime, dtype: datetime64[ns]

Другое возможное решение без проверки других форматов - только переформатированный формат %m/%d/%Y %H:%M до %d/%m/%Y %H:%M:%S %p:

date1 = pd.to_datetime(df['DateTime'], errors = 'coerce', format='%m/%d/%Y %H:%M').dt.strftime('%d/%m/%Y %H:%M:%S %p')

df['DateTime'] = date1.replace('NaT', df['DateTime'])
print (df)
   S. No                DateTime Area
0      1  05/03/2019 06:33:00 AM    A
1      2  06/03/2019 07:23:45 AM    B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...