Я пытаюсь создать новый столбец «Новый» во фрейме данных на основе существующих:
Форматируем результат в формате дата-время.
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()
игнорируется. Как можно избежать этой ошибки?
Исправил код в вопросе, но ошибка та же
После преобразования 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
pd.to_datetime(fffg['MinDate'].astype(str)+' '+fffg['Time'].astype(str))
использует значение Null и поэтому не может выполнить действие. ты не хотел использоватьStart_Date
здесь?