Как использовать pandas.to_datetime со «странными» форматами строк - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь преобразовать столбец данных pandas из строкового типа в datetime, используя pandas.to_datetime.Значения col имеют следующий формат:

Q1'17

, где «Q» - квартал года, а «17» - 2017 год.

У меня также есть нулевые значения в этом столбце (я могу удалить всю строку, где дата пуста).

Я попытался решить ее, исключив квартал и учитывая только год, но не смог преобразоватьНапример, с 16 по 2016 таким образом:

df_cpu["Launch_Date"] = [str(x) for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = [x[3:5] for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = [int(x) for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = pd.to_datetime(df_cpu["Launch_Date"],    format('%Y'))

Даже этот способ не работает:

df_cpu["Launch_Date"] = pd.to_datetime(df_cpu["Launch_Date"], format('Q*\'%Y'))

Поскольку я получаю эту ошибку:

ValueError: ('Неизвестный формат строки:', "Q3'16")

Как мне решить эту проблему?

Я хотел бы получить следующий вид вывода: если для примера значение «Q1'16», я бы хотел получить «01-01-2016».

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

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

Обратите внимание, что в приведенной ниже функции предполагается, что год всегда равен 20--, а выводстрока.Измените выходной тип данных при необходимости.

def new_date(arr):
    if isinstance(arr, str):
        quarter = {'Q1':'01-01-', 'Q2':'04-01-', 'Q3':'07-01-', 'Q4':'10-01-'}
        x, y = arr.split("'")[0], arr.split("'")[1]
        x_new = quarter[x]
        y_new = '20'+y
        return x_new + y_new
    else:
        pass

df_cpu["Launch_Date"] = df_cpu["Launch_Date"].apply(new_date)

Также обратите внимание, что условное выражение is_instance предназначено только для обработки значений NaN.если вы используете pd.dropna (), это не требуется.

0 голосов
/ 20 февраля 2019

Учитывая:

1) предоставленные данные:

df_cpu = pd.DataFrame(["Q1'17","Q3'16"], columns=['Launch_Date'])

2) столбец даты запуска всегда будет иметь длину 5;

Вы можете использовать pd.offsets.QuarterBegin () для добавления кварталов в первый день года:

>> pd.to_datetime(df_cpu.Launch_Date.str[3:5],format='%y') + np.multiply(pd.offsets.QuarterBegin(startingMonth=1), df_cpu.Launch_Date.str[1:2].values.astype(int)-1)
0   2017-01-01
1   2016-07-01
Name: Launch_Date, dtype: datetime64[ns]
0 голосов
/ 20 февраля 2019

Вы можете map первой части строки перейти к значению, которое можно использовать в to_datetime после таких как:

df_cpu = pd.DataFrame({'Launch_Date':["Q1'17", "Q3'16"]})
dict_Q = {"Q1": '01-01-', "Q3": '07-01-'}

print (pd.to_datetime( df_cpu["Launch_Date"].str[:2].map(dict_Q) #replace Qx by a first of month
                       + df_cpu["Launch_Date"].str[3:])) #get the year independtly

0   2017-01-01
1   2016-07-01
Name: Launch_Date, dtype: datetime64[ns]

И не забудьте добавить Q2 и Q4 int dict_Q с нужным желаемым значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...