Pandas новый столбец на основе старого столбца с условной обработкой значения None - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать новый столбец на основе существующего столбца в пандах. Существующий столбец содержит год и квартал. IE: "201901" или не заполнено. Новый столбец должен содержать полную временную метку, если в исходном столбце есть допустимая запись или в противном случае будет пустым.

IE:

Ввод :
201901
201902
Нет
201901

Желаемый выход :
Дата и время (2019,01,01)
datetime (2019,03,01)
Ни один
Дата и время (2019,01,01)

Моя попытка:


    df['stamp'] = np.where(df['quarter'].astype(str).str.len() == 8,\
       datetime( df['quarter'].astype(str).str[0:4].astype(int), \
                 df['quarter'].astype(str).str[4:6].astype(int)*3,1), \
    None)

Результат:

ValueError: invalid literal for int() with base 10: ''

Мне кажется, что код для условной ветви True оценивается для всех строк. Примечание: условие корректно, оно правильно определяет допустимые записи.

Ответы [ 2 ]

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

pandas.to_datetime будет автоматически анализировать кварталы, но он должен быть в формате 2019Q3, за которым следует Q и квартал.

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

import pandas as pd

s = df.stamp.astype(str).replace('\.0', '', regex=True) # Remove .replace if truly integer
pd.to_datetime(s.str[0:4] + 'Q' + s.str[-1], errors='coerce')

#0   2019-01-01
#1   2019-04-01
#2          NaT
#3   2019-01-01
#Name: stamp, dtype: datetime64[ns]

Вы получаете немного мусора 'nanQn' или 'NoneQe' для пропущенных строк, но, поскольку он станет NaT, в любом случае, вероятно, это не имеет большого значения.

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

Не могли бы вы сделать что-то вроде ...

df['stamp'] = df['quarter'].replace('', np.nan, inplace=True)

а потом ваши другие расчеты?

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