У меня есть то, что следует считать синтаксическим вопросом. Я делаю некоторую очистку данных. Мои данные содержат поля даты и времени. Дата всегда присутствует, но иногда время отсутствует. Так:
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)
Вопросы:
Любой, кто хочет попытаться предоставить правильный синтаксис для тернарного оператора. Спасибо и наилучшие пожелания всем
Какой бы подход вы ни использовали, это нормально, если он интуитивно понятен. Однако вы можете просто обновить данные примерно так:
df.loc[~df['time'].str.contains('\:'), 'time'] += ' 12:00AM'
Хорошо, мне придется разобрать это утверждение посимвольно.
~ означает «нет», поэтому везде, где строка не содержит :
, добавьте время к исходному значению. `` здесь просто как escape-символ, и, вероятно, он будет работать без него.
Вы можете использовать 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
Это выглядит как самое простое и понятное решение. Спасибо
Более простой способ сделать это — использовать where
https://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 — это лучший подход к нормализации временных данных — вы можете избежать необходимости писать собственную нормализацию.
NumPy вам не нужен, у Pandas есть свой where
: df['fixed'] = df['date'].where(df['date'].str.contains(':'), df['date'] + ' 00:00 AM')
Благодарить. Это помогает в «обучении»
Спасибо всем за ответы ниже. Хорошая вещь.