Преобразование форматов даты в панде - PullRequest
0 голосов
/ 24 января 2019

У меня есть датафрейм, а в столбце Дата используются два разных типа форматов даты.

eg. 1983-11-10 00:00:00 and 10/11/1983

Я хочу, чтобы все они были одного типа, как я могу перебрать столбец Date моего фрейма данных и преобразовать даты в один формат?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я хочу, чтобы все они были одного типа, как я могу перебрать столбец «Дата» моего фрейма данных и преобразовать даты в один формат?

Ваши входные данные неоднозначны:10 / 11 10 ноября или 11 октября?Вам нужно указать логику, чтобы определить, что подходит.Функция полезна, если вы хотите последовательно попробовать несколько форматов даты:

def date_apply_formats(s, form_lst):
    s = pd.to_datetime(s, format=form_lst[0], errors='coerce')
    for form in form_lst[1:]:
        s = s.fillna(pd.to_datetime(s, format=form, errors='coerce'))
    return s

df['Date'] = date_apply_formats(df['Date'], ['%Y-%m-%d %H:%M:%S', '%d/%m/%Y'])

Приоритет отдается первому элементу в form_lst.Решение может быть расширено до произвольного числа предоставленных форматов.

0 голосов
/ 24 января 2019

Я считаю, что вам нужен параметр dayfirst=True в to_datetime:

df = pd.DataFrame({'Date': {0: '1983-11-10 00:00:00', 1: '10/11/1983'}})
print (df)
                  Date
0  1983-11-10 00:00:00
1           10/11/1983


df['Date'] = pd.to_datetime(df.Date, dayfirst=True)
print (df)
        Date
0 1983-11-10
1 1983-11-10

, потому что:

df['Date'] = pd.to_datetime(df.Date)
print (df)
        Date
0 1983-11-10
1 1983-10-11

Или вы можете указать обаформаты и затем использовать combine_first:

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

df['Date'] = d1.combine_first(d2)
print (df)
        Date
0 1983-11-10
1 1983-11-10

Общее решение для нескольких форматов:

from functools import reduce 

def convert_formats_to_datetimes(col, formats):
    out = [pd.to_datetime(col, format=x, errors='coerce') for x in formats]
    return reduce(lambda l,r: pd.Series.combine_first(l,r), out)

formats = ['%Y-%m-%d %H:%M:%S', '%d/%m/%Y']
df['Date'] = df['Date'].pipe(convert_formats_to_datetimes, formats)
print (df)
        Date
0 1983-11-10
1 1983-11-10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...