Np.where() при создании нового столбца

Я пытаюсь создать новый столбец «Новый» во фрейме данных на основе существующих:

  • если столбец «Мин. дата» равен нулю, то берем данные из столбца «Дата начала»,
  • в противном случае мы берем дату из «Мин. дата» в строковом формате и объединяем ее со временем из столбца «Время».

Форматируем результат в формате дата-время.

fffg = pd.DataFrame({'N': [1, 2, 3], 'MinDate': [date(2023,1,2), None, date(2022,1,7)], 
              'Time': [datetime.time(8, 48, 0), datetime.time(8, 48, 0), datetime.time(8, 48, 0)], 
              'Start_Date': [datetime.datetime(2022,4,1,15,10), datetime.datetime(2023,4,1,15,10), datetime.datetime(2022,5,1,15,10)]})
fffg['MinDate'] = pd.to_datetime(fffg['MinDate'])
fffg['New'] = np.where(pd.notnull(fffg['MinDate']),  
                       pd.to_datetime(fffg['MinDate'].astype(str)+' '+fffg['Time'].astype(str)),
                       fffg['Start_Date']
                       )                       
fffg

Но я получаю ошибку:

ValueError: time data "NaT 08:48:00" doesn't match format "%Y-%m-%d %H:%M:%S", at position 1. You might want to try:
    - passing `format` if your strings have a consistent format;
    - passing `format='ISO8601'` if your strings are all ISO8601 but not necessarily in exactly the same format;
    - passing `format='mixed'`, and the format will be inferred for each element individually. You might want to use `dayfirst` alongside this.

Кажется, что фильтрация внутри np.where() игнорируется. Как можно избежать этой ошибки?

pd.to_datetime(fffg['MinDate'].astype(str)+' '+fffg['Time'].astype(str)) использует значение Null и поэтому не может выполнить действие. ты не хотел использовать Start_Date здесь?
gtomer 05.08.2024 14:01

Исправил код в вопросе, но ошибка та же

Anna 05.08.2024 14:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

После преобразования MinTime в столбец datetime

fffg['MinDate'] = pd.to_datetime(fffg['MinDate'])

недостающие значения заполняются значениями NaT.

Попытка проанализировать объединенные столбцы MinTime и Time не удалась, поскольку pd.to_datetime не может проанализировать значения NaT <time>.

Вы можете организовать операции так, чтобы формат данных результирующей серии, передаваемой в pd.to_datetime, был аналогичен, преобразовав «Start_Date» в тип str и применив pd.to_datetime последним.

mask = fffg['MinDate'].isna()

fffg['New'] = pd.to_datetime(
    np.where(
        mask, 
        fffg['Start_Date'].astype(str), 
        fffg['MinDate'].astype(str).str.cat(fffg['Time'].astype(str), sep=' ')
    )
)
Ответ принят как подходящий

Вам следует избегать выполнения преобразования пустых значений и, следовательно, вам необходимо обрабатывать условия отдельно, поэтому пытайтесь выполнить преобразование только в том случае, если MinDate не равно нулю.

Пример:

# Convert MinDate and Start_Date columns to datetime
fffg['MinDate'] = pd.to_datetime(fffg['MinDate'])
fffg['Start_Date'] = pd.to_datetime(fffg['Start_Date'])

# Create 'New' column based on the condition
fffg['New'] = np.where(
    pd.notnull(fffg['MinDate']),
    pd.to_datetime(fffg['MinDate'].dt.strftime(
        '%Y-%m-%d') + ' ' + fffg['Time'].astype(str)),
    fffg['Start_Date']
)

fffg

Другие вопросы по теме