Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从csv中获取具有开始和结束时间的两个日期范围之间的重叠?_Python_Pandas_Datetime - Fatal编程技术网

Python 如何从csv中获取具有开始和结束时间的两个日期范围之间的重叠?

Python 如何从csv中获取具有开始和结束时间的两个日期范围之间的重叠?,python,pandas,datetime,Python,Pandas,Datetime,我已经问了一个类似的问题,但我能把更多的问题拼凑在一起,但需要更多的帮助。 我希望能够检查开始日期/时间和结束日期/时间重叠的两个日期范围。我的type2大约有50行,而Type1有500多行。我想知道type2的开始和结束,看看它是否在type1的范围内。以下是一小段数据,但日期确实会从2019-04-01日起在接下来的几天内发生变化 type1 type1_start type1_end a 2019-04-01T00:43:18.046Z

我已经问了一个类似的问题,但我能把更多的问题拼凑在一起,但需要更多的帮助。 我希望能够检查开始日期/时间和结束日期/时间重叠的两个日期范围。我的type2大约有50行,而Type1有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的开始/结束都经过每种类型1


任何帮助都将不胜感激。

这里有一种方法:

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)

以下是一种方法:

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)

以下
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)))
df_new=df1.assign(key=1)\
.merge(df2.assign(key=1),on='key')\
.assign(具有重叠=λx:~((x.type2\u开始>x.type1\u结束)|(x.type2\u结束

参考:

以下
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)))
df_new=df1.assign(key=1)\
.merge(df2.assign(key=1),on='key')\
.assign(具有重叠=λx:~((x.type2\u开始>x.type1\u结束)|(x.type2\u结束

REF:

这就是我想要的,但我需要将每个类型2与每个类型1进行检查。目前它正在检查type1和type2中的一行。有什么想法吗?这就是我想要的,但是我需要检查每种类型2和每种类型1。目前它正在检查type1和type2中的一行。有什么想法吗?
x
在这方面意味着什么?这也不起作用:(
x
是函数参数,对于
assign()
函数,它是交叉联接后的合并数据帧。您收到的错误消息是什么?
x
在这方面意味着什么?这也不起作用:(
x
是函数参数,对于
assign())
function它是交叉连接后的合并数据帧。您收到的错误消息是什么?