Как получить перекрытие между двумя диапазонами дат, которые имеют время начала и окончания из CSV? - PullRequest
0 голосов
/ 26 марта 2019

Я уже задавал похожий вопрос, но смог собрать еще немного, но мне нужна дополнительная помощь. Определение того, как один диапазон дат / времени перекрывается со вторым диапазоном дат / времени? Я хочу иметь возможность проверить, когда два диапазона дат с датой / временем начала и датой / временем начала перекрываются.В моем type2 около 50 строк, а в type 1 - более 500. Я хочу иметь возможность взять начало и конец type2 и посмотреть, попадает ли он в диапазон type1.Вот фрагмент данных, однако даты меняются по списку с 2019-04-01 на следующие дни.

    type1 type1_start                type1_end
    a    2019-04-01T00:43:18.046Z    2019-04-01T00:51:35.013Z
    b    2019-04-01T02:16:46.490Z    2019-04-01T02:23:23.887Z
    c    2019-04-01T03:49:31.981Z    2019-04-01T03:55:16.153Z
    d    2019-04-01T05:21:22.131Z    2019-04-01T05:28:05.469Z

    type2 type2_start                type2_end
    1    2019-04-01T00:35:12.061Z    2019-04-01T00:37:00.783Z
    2    2019-04-02T00:37:15.077Z    2019-04-02T00:39:01.393Z
    3    2019-04-03T00:39:18.268Z    2019-04-03T00:41:01.844Z
    4    2019-04-04T00:41:21.576Z    2019-04-04T00:43:02.071Z`

Я нашел лучший способ найти это и прочитал Определить, перекрываются ли два диапазона дат и понимаю, как это должно быть сделано, но я не знаю достаточно окак вызвать переменные и заставить их работать.

#Here is what I have, but I am stuck and have no clue where to go form here:

import pandas as pd
from pandas import Timestamp
import numpy as np
from collections import namedtuple

colnames = ['type1', 'type1_start', 'type1_end', 'type2', 'type2_start', 'type2_end']
data = pd.read_csv('test.csv', names=colnames, parse_dates=['type1_start', 'type1_end','type2_start', 'type2_end'])

A_start = data['type1_start']
A_end = data['type1_end']
B_start= data['typer2_start']
B_end = data['type2_end']
t1 = data['type1']
t2 = data['type2']

r1 = (B_start, B_end)
r2 = (A_start, A_end)

def doesOverlap(r1, r2):
    if B_start > A_start:
        swap(r1, r2)
    if A_start > B_end:
        return false
    return true

Было бы неплохо иметь csv с результатом перекрытия истинного или ложного.Я смог заставить мои данные работать, используя это также Эффективно находить перекрытие диапазонов даты и времени с 2 кадрами данных , но это не правильно в результатах.Я добавил пару строк, которые, как я знаю, должны перекрываться с данными, и это не сработало.Мне нужно, чтобы каждый начало / конец типа 2 проходил через каждый тип 1.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Ниже df1 содержит type1 записей и df2 содержит type2 записей:

df_new = df1.assign(key=1)\
            .merge(df2.assign(key=1), on='key')\
            .assign(has_overlap=lambda x: ~((x.type2_start > x.type1_end) | (x.type2_end < x.type1_start)))

REF: Производительное декартово произведение (CROSS JOIN) с пандами

0 голосов
/ 26 марта 2019

Вот один из способов сделать это:

import pandas as pd


def overlaps(row):
    if ((row['type1_start'] < row['type2_start'] and row['type2_start'] < row['type1_end'])
            or (row['type1_start'] < row['type2_end'] and row['type2_end'] < row['type1_end'])):
        return True

    else:
        return False


colnames = ['type1', 'type1_start', 'type1_end', 'type2', 'type2_start', 'type2_end']
df = pd.read_csv('test.csv', names=colnames, parse_dates=[
    'type1_start', 'type1_end', 'type2_start', 'type2_end'])

df['overlap'] = df.apply(overlaps, axis=1)

print('\n', df)

дает:

    type1               type1_start                 type1_end  type2               type2_start                 type2_end  overlap
0  type1               type1_start                 type1_end  type2               type2_start                 type2_end    False
1      a  2019-03-01T00:43:18.046Z  2019-04-02T00:51:35.013Z      1  2019-04-01T00:35:12.061Z  2019-04-01T00:37:00.783Z     True
2      b  2019-04-01T02:16:46.490Z  2019-04-01T02:23:23.887Z      2  2019-04-02T00:37:15.077Z  2019-04-02T00:39:01.393Z    False
3      c  2019-04-01T03:49:31.981Z  2019-04-01T03:55:16.153Z      3  2019-04-03T00:39:18.268Z  2019-04-03T00:41:01.844Z    False
4      d  2019-04-01T05:21:22.131Z  2019-04-01T05:28:05.469Z      4  2019-04-04T00:41:21.576Z  2019-04-04T00:43:02.071Z    False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...