Python 如何从csv中获取具有开始和结束时间的两个日期范围之间的重叠?
我已经问了一个类似的问题,但我能把更多的问题拼凑在一起,但需要更多的帮助。 我希望能够检查开始日期/时间和结束日期/时间重叠的两个日期范围。我的type2大约有50行,而Type1有500多行。我想知道type2的开始和结束,看看它是否在type1的范围内。以下是一小段数据,但日期确实会从2019-04-01日起在接下来的几天内发生变化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
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它是交叉连接后的合并数据帧。您收到的错误消息是什么?