Преобразование даты и времени — преобразование только даты для строк, не содержащих времени

#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 столбец s datetime в , а затем извлекает только 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?