Условное заполнение столбцов даты и времени в пандах - PullRequest
2 голосов
/ 03 мая 2019

У меня есть столбец DateTime в кадре данных pandas, и я хочу создать новый столбец, который будет заполняться условно на основе значения datetime_column.

Пример моего кадра данных:

datetime_column
2018-09-19 17:00:03
NaT
NaT
NaT
2018-09-20 07:00:30
NaT
NaT
NaT
2018-09-21 13:00:30
NaT
NaT
NaT
Nat
2018-09-22 20:00:30
NaT
NaT
NaT
NaT
2018-09-22 04:00:30

ЕслиЗначение datetime_column находится между временем 00:00:00 и 09:00:00, оно должно заполнить его предыдущим значением, иначе оно должно быть заполнено тем же значением, что и значение datetime_column

Ожидаемый фрейм данных:

datetime_column         datetime_column_x
2018-09-19 17:00:03     2018-09-19 17:00:03
NaT
NaT
NaT
2018-09-20 07:00:30     2018-09-19 17:00:03
NaT
NaT
NaT
2018-09-21 13:00:30     2018-09-21 13:00:30
NaT 
NaT
NaT
Nat
2018-09-22 20:00:30     2018-09-22 20:00:30
NaT
NaT
NaT
NaT
2018-09-22 04:00:30     2018-09-22 20:00:30

Пробный код:

start_time : '00:00:00'
end_time :   '12:00:00'
df['datetime_column_x'] = np.where((df['datetime'] >= start_time & 
                          df['datetime']<= end_time), df['datetime']-1, 
                          df['datetime'])

Но приведенный выше код дает мне ошибку:

TypeError: cannot compare a dtyped [datetime64[ns]] array with a scalar of type [bool]

Я был бы очень признателен, если бы я мог помочь с этим.

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Вы должны использовать shift здесь

s=df['datetime_column'].ffill()
df['datetime_column_x']=np.where(df.datetime_column.dt.hour.between(0,9),s.shift(),df['datetime_column'])
df
Out[441]: 
       datetime_column   datetime_column_x
0  2018-09-19 17:00:03 2018-09-19 17:00:03
1                  NaT                 NaT
2                  NaT                 NaT
3                  NaT                 NaT
4  2018-09-20 07:00:30 2018-09-19 17:00:03
5                  NaT                 NaT
6                  NaT                 NaT
7                  NaT                 NaT
8  2018-09-21 13:00:30 2018-09-21 13:00:30
9                  NaT                 NaT
10                 NaT                 NaT
11                 NaT                 NaT
12                 NaT                 NaT
13 2018-09-22 20:00:30 2018-09-22 20:00:30
14                 NaT                 NaT
15                 NaT                 NaT
16                 NaT                 NaT
17                 NaT                 NaT
18 2018-09-22 04:00:30 2018-09-22 20:00:30
0 голосов
/ 03 мая 2019

Ответ Вэнь-Бена исчерпывающий, но убедитесь, что ваши даты в правильном формате, чтобы сравнивать их с библиотекой datetime python. Это не будет работать с numy datetime64 объектами.

Конвертируйте даты в datetime или панд Timestamp объектов:

df['datetime'] = pd.to_datetime(df.loc[:, 'datetime'])
# or
df['datetime'] = df.loc[:, 'datetime'].apply(pd.Timestamp)

Затем сделайте, как говорит Вэнь-Бен, сравнивая атрибуты datetime.time.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...