python длительность перекрытия временного интервала - PullRequest
1 голос
/ 28 февраля 2020

Мой вопрос похож на Эффективное вычисление перекрытия диапазона дат в python? , однако мне нужно вычислить перекрытие с полной отметкой времени, а не днями, но, что более важно, я не могу указать конкретный c дата как перекрытие, а не только часы.

import pandas as pd
import numpy as np

df = pd.DataFrame({'first_ts': {0: np.datetime64('2020-01-25 07:30:25.435000'),
  1: np.datetime64('2020-01-25 07:25:00')},
 'last_ts': {0: np.datetime64('2020-01-25 07:30:25.718000'),
  1: np.datetime64('2020-01-25 07:25:00')}})
df['start_hour'] = 7
df['start_minute'] = 0
df['end_hour'] = 8
df['end_minute'] = 0
display(df)

Как рассчитать продолжительность перекрытия интервала (first_ts, last_ts) со вторым интервалом в миллисекундах? Потенциально мне нужно было бы построить временную метку для каждого дня с интервалом, определенным часами, а затем вычислить перекрытие.

1 Ответ

2 голосов
/ 28 февраля 2020

Идея состоит в том, чтобы создать новую серию для даты начала и окончания с датами по столбцам даты и времени, использовать numpy.minimum и numpy.maximum, вычесть, преобразовать таймдельты в Series.dt.total_seconds и кратно 1000:

s = (df['first_ts'].dt.strftime('%Y-%m-%d ') + 
     df['start_hour'].astype(str) + ':' + 
     df['start_minute'].astype(str))
e = (df['last_ts'].dt.strftime('%Y-%m-%d ') + 
     df['end_hour'].astype(str) + ':' +
     df['end_minute'].astype(str))

s = pd.to_datetime(s, format='%Y-%m-%d %H:%M')
e = pd.to_datetime(e, format='%Y-%m-%d %H:%M')

df['inter'] = ((np.minimum(e, df['last_ts']) - 
                np.maximum(s, df['first_ts'])).dt.total_seconds() * 1000)
print (df)
                 first_ts                 last_ts  start_hour  start_minute  \
0 2020-01-25 07:30:25.435 2020-01-25 07:30:25.718           7             0   
1 2020-01-25 07:25:00.000 2020-01-25 07:25:00.000           7             0   

   end_hour  end_minute  inter  
0         8           0  283.0  
1         8           0    0.0  

Другая идея - использовать только np.minumum:

df['inter'] = (np.minimum(df['last_ts'] - df['first_ts'], e - s).dt.total_seconds() * 1000)
print (df)
                 first_ts                 last_ts  start_hour  start_minute  \
0 2020-01-25 07:30:25.435 2020-01-25 07:30:25.718           7             0   
1 2020-01-25 07:25:00.000 2020-01-25 07:25:00.000           7             0   

   end_hour  end_minute  inter  
0         8           0  283.0  
1         8           0    0.0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...