Конвертировать строку в дату в python, если строка даты имеет другой формат - PullRequest
0 голосов
/ 28 июня 2019

У моих данных есть переменная даты с двумя разными форматами даты

Date
01 Jan 2019
02 Feb 2019
01-12-2019
23-01-2019
11-04-2019
22-05-2019

Я хочу преобразовать эту строку в дату (ГГГГ-мм-дд)

Date
2019-01-01
2019-02-01
2019-12-01
2019-01-23
2019-04-11
2019-05-22

Я попробовал следующеевещи, но я ищу лучший подход

df['Date'] = np.where(df['Date'].str.contains('-'), pd.to_datetime(df['Date'], format='%d-%m-%Y'), pd.to_datetime(df['Date'], format='%d %b %Y'))

Рабочее решение для меня

df['Date_1']= np.where(df['Date'].str.contains('-'),df['Date'],np.nan)
df['Date_2']= np.where(df['Date'].str.contains('-'),np.nan,df['Date'])
df['Date_new'] = np.where(df['Date'].str.contains('-'),pd.to_datetime(df['Date_1'], format = '%d-%m-%Y'),pd.to_datetime(df['Date_2'], format = '%d %b %Y'))

Ответы [ 4 ]

1 голос
/ 28 июня 2019

Просто используйте опцию dayfirst=True

pd.to_datetime(df.Date, dayfirst=True)

Out[353]:
0   2019-01-01
1   2019-02-02
2   2019-12-01
3   2019-01-23
4   2019-04-11
5   2019-05-22
Name: Date, dtype: datetime64[ns]
0 голосов
/ 28 июня 2019

Это работает просто, как и ожидалось -

import pandas as pd

a = pd. DataFrame({
        'Date' : ['01 Jan 2019',
                '02 Feb 2019',
                '01-12-2019',
                '23-01-2019',
                '11-04-2019',
                '22-05-2019']
    })
a['Date'] = a['Date'].apply(lambda date: pd.to_datetime(date, dayfirst=True))

print(a)
0 голосов
/ 28 июня 2019

Вы можете получить желаемый результат с помощью метода панд apply И to_datetime, как указано ниже: -

import pandas pd

def change(value):
    return pd.to_datetime(value)

df = pd.DataFrame(data = {'date':['01 jan 2019']})

df['date'] = df['date'].apply(change)
df

Я надеюсь, что это может помочь вам.

0 голосов
/ 28 июня 2019

Мое предложение: Определите функцию преобразования следующим образом:

import datetime as dt

def conv_date(x):
    try:
        res = pd.to_datetime(dt.datetime.strptime(x, "%d %b %Y"))
    except ValueError:
        res = pd.to_datetime(dt.datetime.strptime(x, "%d-%m-%Y"))
    return res

Теперь получите новый столбец даты следующим образом:

df['Date_new'] = df['Date'].apply(lambda x: conv_date(x))
...