Создайте новое поле для вычисления DateTime из двух других полей, при условии наличия текста - PullRequest
1 голос
/ 21 апреля 2020

У меня есть Pandas фрейм данных, который содержит два столбца DateTime, один с «Start_Date», а другой с «End_Date».

Я бы хотел вычислить новое поле 'Mid_Date' (среднее между «Start_Date» и «End_Date» для каждой записи в кадре данных), но для некоторых строк «END_DATE» содержит «NULL» ( как текстовая строка). Для этих строк с 'NULL' мне нужно использовать только 'START_DATE' для новой строки 'Mid_Date'.

Я не могу понять, как сделать это как функцию / Для L oop сочетание. Буду признателен за руководство.

1 Ответ

0 голосов
/ 22 апреля 2020

На самом деле вам не нужен al oop в вашем скрипте для достижения этой цели. Давайте создадим пример DataFrame. Замените любую строку 'NULL' в столбцах даты на NaN.

import numpy as np
import pandas as pd

df = pd.DataFrame({'Start_Date': ['2020-01-02', '2020-01-09', '2020-01-20'],
                   'End_Date': ['2020-01-06', 'NULL', '2020-01-25']}).replace('NULL', np.nan)

# df
#    Start_Date    End_Date
# 0  2020-01-02  2020-01-06
# 1  2020-01-09         NaN
# 2  2020-01-20  2020-01-25

Теперь проанализируйте все строки даты на datetime объектах, затем вычислите столбец 'Mid_Date', используя дату начала плюс половину дельта в днях. Обратите внимание, что теперь у вас есть 'Mid_Date' в качестве столбца DateTime, а не только Date. Кроме того, неравномерное деление на 2 добавляет несколько часов к результату:

df[['Start_Date', 'End_Date']] = df[['Start_Date', 'End_Date']].apply(pd.to_datetime)

df['Mid_Date'] = (df.Start_Date + (df.End_Date - df.Start_Date) / 2)

# df
#   Start_Date   End_Date            Mid_Date
# 0 2020-01-02 2020-01-06 2020-01-04 00:00:00
# 1 2020-01-09        NaT                 NaT
# 2 2020-01-20 2020-01-25 2020-01-22 12:00:00

Теперь вы можете заменить любое «NaN» в столбце «Mid_Date» значением из столбца «Start_Date» и, если хотите, 'Mid_Date' - столбец с чистой датой (лишите H: M: S), вы также можете сделать это, добавив .dt.date:

df['Mid_Date'] = df.Mid_Date.fillna(df.Start_Date).dt.date

# df
#   Start_Date   End_Date    Mid_Date
# 0 2020-01-02 2020-01-06  2020-01-04
# 1 2020-01-09        NaT  2020-01-09
# 2 2020-01-20 2020-01-25  2020-01-22
...