У меня есть два типа формата даты и времени в Dataframe.

Date
2019-01-06  00:00:00 (%Y-%d-%m %H:%M:%S')
07/17/2018 ('%m/%d/%Y')

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

d1 = pd.to_datetime(df1['DATE'], format='%m/%d/%Y',errors='coerce')
d2 = pd.to_datetime(df1['DATE'], format='%Y-%d-%m %H:%M:%S',errors='coerce')
df1['Date'] = d2.fillna(d1)

При этом код заменяет одно другое datetime другим. Например: 7 января 2018 года будет 1 июля 2018 года. Эта проблема связана с этим форматом (% Y-% d-% m% H:% M:% S ') после выполнения вышеуказанного сценария.

1
AB14 9 Апр 2021 в 07:59

1 ответ

Лучший ответ

Если есть смешанный формат также в формате 2019-01-06 00:00:00 - это означает, что это должен быть январь или июнь, единственный способ - установить приоритет одного формата - например, здесь первые месяцы и добавьте сначала формат d2, а затем d3 в цепочке fillna:

d1 = pd.to_datetime(df1['DATE'], format='%m/%d/%Y',errors='coerce')
d2 = pd.to_datetime(df1['DATE'], format='%Y-%m-%d %H:%M:%S',errors='coerce')
d3 = pd.to_datetime(df1['DATE'], format='%Y-%d-%m %H:%M:%S',errors='coerce')

df1['Date'] = d2.fillna(d1).fillna(d3)

При необходимости расставьте приоритеты в первые дни:

df1['Date'] = d3.fillna(d1).fillna(d2)

В данных выборки можно проверить разницу:

print (df1)
                  DATE
0  2019-01-06 00:00:00
1  2019-01-15 00:00:00
2  2019-20-10 00:00:00
3           07/17/2018

d1 = pd.to_datetime(df1['DATE'], format='%m/%d/%Y',errors='coerce')
d2 = pd.to_datetime(df1['DATE'], format='%Y-%m-%d %H:%M:%S',errors='coerce')
d3 = pd.to_datetime(df1['DATE'], format='%Y-%d-%m %H:%M:%S',errors='coerce')

df1['Date1'] = d2.fillna(d1).fillna(d3)
df1['Date2'] = d3.fillna(d1).fillna(d2)
print (df1)
                  DATE      Date1      Date2
0  2019-01-06 00:00:00 2019-01-06 2019-06-01 <- difference
1  2019-01-15 00:00:00 2019-01-15 2019-01-15
2  2019-20-10 00:00:00 2019-10-20 2019-10-20
3           07/17/2018 2018-07-17 2018-07-17
2
jezrael 9 Апр 2021 в 06:36