Вычтите два numpy массива, содержащих datetime.time - PullRequest
2 голосов
/ 04 апреля 2020

В моем скрипте я получаю два огромных массива np, которые я хочу вычесть. Первый numpy массив start_per_day с указанием времени начала рабочего дня и второй numpy массив end_per_day. Однако я получаю ошибку ниже. Не могу понять, признателен за любую помощь.

Edit: ниже приведен минимальный воспроизводимый пример, где массивы были искусственно созданы мной

Edit2: Так как я Несколько раз меня спрашивали о происхождении моих двух массивов datetime.time numpy, я извлекаю их из pandas groupby с минимальным и максимальным значениями, см. код ниже

print(one_employe)
start_per_day = one_employe.groupby('Date')['Time'].min()
end_per_day = one_employe.groupby('Date')['Time'].max()
print(end_per_day.values)
print(start_per_day.values)

Вывод из 3 команд печати

   ID            Datetime        Date      Time
0  13 2020-03-02 09:43:00  2020-03-02  09:43:00
3  13 2020-03-02 18:22:00  2020-03-02  18:22:00
5  13 2020-03-03 09:51:00  2020-03-03  09:51:00
8  13 2020-03-03 18:28:00  2020-03-03  18:28:00
[datetime.time(18, 22) datetime.time(18, 28)]
[datetime.time(9, 43) datetime.time(9, 51)]

Оригинальный почтовый индекс -

import datetime
import numpy as np
start_per_day = np.array([datetime.time(9, 43),datetime.time(9, 51)])
end_per_day = np.array([datetime.time(18,22),datetime.time(18,29)])

#Attemps that didnt work:
np.datetime64(end_per_day) - np.datetime64(start_per_day)
datetime.timedelta( end_per_day, start_per_day)
end_per_day - start_per_day

Ошибка :

Ошибка типа: неподдерживаемые типы операндов для -: 'datetime.time' и 'datetime.time'

1 Ответ

2 голосов
/ 04 апреля 2020

Вы можете использовать datetime.timedelta вместо datetime.time:

import datetime
import numpy as np

start_per_day = np.array([datetime.timedelta(hours=9, minutes=43), datetime.timedelta(hours=9, minutes=51)])
end_per_day = np.array([datetime.timedelta(hours=18, minutes=22), datetime.timedelta(hours=18, minutes=29)])

delta_per_day = end_per_day - start_per_day

print(delta_per_day[0])
print(delta_per_day[1])

Я искал способ вычесть datetime.time объектов, но не смог найти ни одного.


Тестирование преобразования (без al oop):

t1 = np.array([datetime.time(9, 43),datetime.time(9, 51)])
t2 = np.array([datetime.time(18, 22), datetime.time(18, 29)])

start_per_day = np.array([datetime.timedelta(hours=t1[0].hour, minutes=t1[0].minute), datetime.timedelta(hours=t1[1].hour, minutes=t1[1].minute)])
end_per_day = np.array([datetime.timedelta(hours=t2[0].hour, minutes=t2[0].minute), datetime.timedelta(hours=t2[1].hour, minutes=t2[1].minute)])

delta_per_day = end_per_day - start_per_day

print(delta_per_day[0])
print(delta_per_day[1])

Преобразование массива datetime.time объектов в массив datetime.timedelta объектов:

def time_to_delat(t):
    """Convert datetime.time object with hour and minute to datetime.timedelta object"""
    dt = datetime.timedelta(hours=t.hour, minutes=t.minute)
    return dt

start_per_day = np.array([datetime.time(9, 43),datetime.time(9, 51)])
end_per_day = np.array([datetime.time(18, 22), datetime.time(18, 29)])

# Convert array of datetime.time objects to array of datetime.timedelta objects
start_per_day_dt = np.array([time_to_delat(x) for x in start_per_day])
end_per_day_dt = np.array([time_to_delat(x) for x in end_per_day])

delta_per_day = end_per_day_dt - start_per_day_dt

print(delta_per_day[0])
print(delta_per_day[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...