#python #pandas #dataframe #numpy #datetime
Вопрос:
У меня есть фрейм данных
df = pd.DataFrame( { 'ID': ['AB01', 'AB02', 'AB03', 'AB04','AB05', 'AB06'], 'l_date': ["1/4/2021","1/4/2021",'1/5/2021','1/5/2021','1/8/2021', np.nan], 'l_time': ["17:05", "6:00","13:43:10","00:00",np.nan,np.nan] } )
И я хочу создать новый столбец, который объединяет l_date
и l_time
в столбец даты и времени, l_datetime
.
Мой код таков
cols = ['l_date','l_time'] df['d_datetime'] = df[cols].astype(str).agg(' '.join, axis=1) df['d_datetime'] = df['d_datetime'].replace({'nan':''}, regex=True) df['d_datetime'] = pd.to_datetime(df['d_datetime'], errors="coerce").dt.strftime("%d/%m/%Y %H:%M")
Теперь это генерирует время для AB05
as 00:00
и создает дату-время. Но для тех , у кого нет времени в столбце l_time
, я хочу d_datetime
, чтобы была только дата. Как я могу этого достичь?
В конце концов я попытался
df['d_datetime'] = df['d_datetime'].replace({' 00:00':''}, regex=True)
Но это AB04
тоже отнимает время, а я этого не хочу. Как я могу добиться конечного результата, как показано ниже?
Обновить
Из приведенного ниже результата:
Я хочу проверить, так ли l_time
это NaN
, и если да, то я хочу применить replace({'00:00':''})
к этой строке. Как я могу этого достичь?
Комментарии:
1. @MrFuppes Это не работает. Мне нужно
05/01/2021 00:00
дляAB04
и1/8/2021
дляAB05
2. @Mrfupps Почему ваши комментарии удаляются? Я просто пытался сделать это с помощью предложения ur плюс
loc
для str.заменить без успеха… не могли бы вы, пожалуйста, более подробно рассказать, с каким синтаксисом будетloc
?3. @Rabinzel Я удалил их, потому что считаю, что они вводили в заблуждение. Ответ Мухаммадхассана, похоже, дает то, что, по-моему, нужно оператору.
4. @Rabinzel Я обновил вопрос, как я могу применить новое условие if?
5. Я думаю, вы хотели спросить @mrfupps или кого-то еще, потому что я сам только учусь работать с пандами, извините. Мне было просто любопытно, куда добавить решение
loc
in mrfupps, чтобы оно работало независимо от уже заданного Мухаммедом варианта
Ответ №1:
Воспользуйся:
df['d_datetime'] = (pd.to_datetime(df['l_date']).dt.strftime("%d/%m/%Y") ' ' pd.to_datetime(df['l_time']).dt.time.replace(np.nan, '').astype(str).str[0:5]).str.strip()
OUTPUT:
ID l_date l_time d_datetime 0 AB01 1/4/2021 17:05 04/01/2021 17:05 1 AB02 1/4/2021 6:00 04/01/2021 06:00 2 AB03 1/5/2021 13:43:10 05/01/2021 13:43 3 AB04 1/5/2021 00:00 05/01/2021 00:00 4 AB05 1/8/2021 NaN 08/01/2021 5 AB06 NaN NaN NaN
Комментарии:
1. Привет, вы можете помочь мне понять, что здесь происходит
df['l_time'].replace(np.nan, '').str[0:5]).str.strip()
2. Эта
pd.to_datetime(df['l_time']).dt.time
строка преобразуетl_time
столбец sdatetime
в , а затем извлекает толькоtime
, он будет созданNaN
для строк, которыхl_time
не существует. Тогда мы должны использовать это.replace(np.nan, '')
так, чтобы при добавленииl_date
иl_time
у нас не былоNaN
в конце. Затем мы используем это.astype(str).str[0:5]
, чтобы получить только часть минут и секунд. Наконец, после добавления двух столбцов используйте это.str.strip()
, чтобы удалить все завершающие пробелы из последнего столбца.
Ответ №2:
df.loc[df["l_time"].isnull(), "d_datetime"] = df["d_datetime"].replace( {"00:00": ""}, regex=True )
Ответ №3:
Вот решение:
import pandas as pd import numpy as np df = pd.DataFrame( { 'ID': ['AB01', 'AB02', 'AB03', 'AB04','AB05', 'AB06'], 'l_date': ["1/4/2021","1/4/2021",'1/5/2021','1/5/2021','1/8/2021', np.nan], 'l_time': ["17:05", "6:00","13:43:10","00:00",np.nan,np.nan] } ) df.l_time = df.l_time.fillna('') df['d_datetime']= df['l_date'].astype(str) " " df['l_time'].astype(str) print(df)
Комментарии:
1. Да @Vivs, у меня есть формат, в который мне нужно преобразовать
2. я внес небольшое изменение, чтобы добавить места.
3. Я обновил вопрос, как я могу применить новое условие if?