Кадр данных Python Pandas выбирает строки с помощью тернарного оператора

У меня есть то, что следует считать синтаксическим вопросом. Я делаю некоторую очистку данных. Мои данные содержат поля даты и времени. Дата всегда присутствует, но иногда время отсутствует. Так:

3/1/2023 11:03 AM
4/8/2022 10:21 AM
7/19/2012
7/12/2021
4/16/2024 7:02 AM

Итак, если полное двоеточие (:) отсутствует, я хочу объединить 00:00 AM.

Я ожидал, что это сработает:

dfAssetMeter_a['lastReadingDTFixed'] = dfAssetMeter_a['LASTREADINGDATE'].astype(str) if dfAssetMeter_a['LASTREADINGDATE'].astype(str).find(':') > 0 else dfAssetMeter_a['LASTREADINGDATE'].astype(str) + ' 00:00 AM'  

но это не сработало.

Однако это работает:

def fixDateTime(dateStr_in):
    return dateStr_in if dateStr_in.find(':') > 0 else dateStr_in + ' 12:00 AM'

dfAssetMeter_a['lastReadingDTFixed'] = dfAssetMeter_a['LASTREADINGDATE'].apply(fixDateTime)

Вопросы:

  • Какой способ сделать это на «Python» был бы более правильным?
  • Может ли кто-нибудь предоставить правильный синтаксис для первого метода?

Спасибо всем за ответы ниже. Хорошая вещь.

KBD 28.06.2024 15:09

Любой, кто хочет попытаться предоставить правильный синтаксис для тернарного оператора. Спасибо и наилучшие пожелания всем

KBD 28.06.2024 15:10
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Какой бы подход вы ни использовали, это нормально, если он интуитивно понятен. Однако вы можете просто обновить данные примерно так:

df.loc[~df['time'].str.contains('\:'), 'time'] += ' 12:00AM'

Хорошо, мне придется разобрать это утверждение посимвольно.

KBD 28.06.2024 15:04

~ означает «нет», поэтому везде, где строка не содержит :, добавьте время к исходному значению. `` здесь просто как escape-символ, и, вероятно, он будет работать без него.

Chris 28.06.2024 15:36
Ответ принят как подходящий

Вы можете использовать pandas.to_datetime с format='mixed'.

import pandas as pd

df = pd.DataFrame(
    {
        "LASTREADINGDATE": [
            "3/1/2023 11:03 AM",
            "4/8/2022 10:21 AM",
            "7/19/2012",
            "7/12/2021",
            "4/16/2024 7:02 AM",
        ]
    }
)

df["lastReadingDTFixed"] = pd.to_datetime(df["LASTREADINGDATE"], format = "mixed")
     LASTREADINGDATE  lastReadingDTFixed
0  3/1/2023 11:03 AM 2023-03-01 11:03:00
1  4/8/2022 10:21 AM 2022-04-08 10:21:00
2          7/19/2012 2012-07-19 00:00:00
3          7/12/2021 2021-07-12 00:00:00
4  4/16/2024 7:02 AM 2024-04-16 07:02:00

Это выглядит как самое простое и понятное решение. Спасибо

KBD 28.06.2024 15:08

Более простой способ сделать это — использовать wherehttps://pandas.pydata.org/docs/reference/api/pandas.DataFrame.where.html

Допустим, у нас есть следующий фрейм данных:

df = pd.DataFrame()
df['date'] = ['3/1/2023 11:03 AM', '4/8/2022 10:21 AM', '7/19/2012']

Следующее задание позволит выполнить описанную вами задачу.

df['fixed'] = df['date'].where(df['date'].str.contains(':'), df['date'] + ' 00:00 AM')

Результат:

                date               fixed
0  3/1/2023 11:03 AM   3/1/2023 11:03 AM
1  4/8/2022 10:21 AM   4/8/2022 10:21 AM
2          7/19/2012  7/19/2012 00:00 AM

Это общий подход к эмуляции тернарного оператора. Но ответ @e-motta — это лучший подход к нормализации временных данных — вы можете избежать необходимости писать собственную нормализацию.

Jonny 27.06.2024 18:04

NumPy вам не нужен, у Pandas есть свой where: df['fixed'] = df['date'].where(df['date'].str.contains(':'), df['date'] + ' 00:00 AM')

Timus 27.06.2024 21:06

Благодарить. Это помогает в «обучении»

KBD 28.06.2024 15:06

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