Матрица временных интервалов в pandas (попарно)

#python #pandas #datetime #timedelta

#питон #панды #дата и время #timedelta

Вопрос:

У меня есть две серии панд:

 A = pd.Series(['2020-01-01 00:10:00', '2020-01-01 02:20:00'], dtype=pd.datetime64)
B = pd.Series(['2020-01-01 00:00:00', '2020-01-01 02:30:00', '2020-01-01 03:00:00', dtype=pd.datetime64)
 

Каков самый быстрый способ получить матрицу (фрейм данных pandas или массив numpy 2D) абсолютных значений временных интервалов (в минутах) между каждой датой и временем в двух последовательных последовательностях?

Результат должен быть похож на эту таблицу:

 10  | 140 | 170
140 |  10 |  40
 

Есть ли какая-либо функция для этого или единственный вариант — сделать двойной цикл for?

Ответ №1:

Вы можете преобразовать серию в числовой массив, вычесть с помощью широковещания с преобразованием выходных данных в абсолютные значения с разделением для конечного 2d-массива:

 A = pd.Series(['2020-01-01 00:10:00', '2020-01-01 02:20:00'])
B = pd.Series(['2020-01-01 00:00:00', '2020-01-01 02:30:00', '2020-01-01 03:00:00'])
    
A = pd.to_datetime(A)
B = pd.to_datetime(B)
           
a = A.to_numpy()[:, None] - B.to_numpy()
a = np.abs(a) / (60 * 10 ** 9)
print (a)

[[ 10 140 170]
 [140  10  40]]       
 

Комментарии:

1. Отличный ответ! Не могли бы вы объяснить, что такое (60 * 10 ** 9 ), пожалуйста?

2. @doktr — конечно, разница в наносекундах, поэтому для преобразования в минуты используется деление на (60 * 10 ** 9)