在python中查找日期范围重叠

2024-04-15

我试图找到一种更有效的方法来根据特定列(id)在数据框中查找重叠的数据范围(每行提供的开始/结束日期)。数据框按“来自”列排序。我认为有一种方法可以避免双重apply像我一样运行:

import pandas as pd
from datetime import datetime

df = pd.DataFrame(columns=['id','from','to'], index=range(5), \
                  data=[[878,'2006-01-01','2007-10-01'],
                        [878,'2007-10-02','2008-12-01'],
                        [878,'2008-12-02','2010-04-03'],
                        [879,'2010-04-04','2199-05-11'],
                        [879,'2016-05-12','2199-12-31']])

df['from'] = pd.to_datetime(df['from'])
df['to'] = pd.to_datetime(df['to'])


    id  from        to
0   878 2006-01-01  2007-10-01
1   878 2007-10-02  2008-12-01
2   878 2008-12-02  2010-04-03
3   879 2010-04-04  2199-05-11
4   879 2016-05-12  2199-12-31

我使用“apply”函数在所有组上循环,并且在每个组内,我每行使用“apply”:

def check_date_by_id(df):
    
    df['prevFrom'] = df['from'].shift()
    df['prevTo'] = df['to'].shift()
    
    def check_date_by_row(x):
        
        if pd.isnull(x.prevFrom) or pd.isnull(x.prevTo):
            x['overlap'] = False
            return x
        
        latest_start = max(x['from'], x.prevFrom)
        earliest_end = min(x['to'], x.prevTo)
        x['overlap'] = int((earliest_end - latest_start).days) + 1 > 0
        return x
    
    return df.apply(check_date_by_row, axis=1).drop(['prevFrom','prevTo'], axis=1)

df.groupby('id').apply(check_date_by_id)

    id  from        to          overlap
0   878 2006-01-01  2007-10-01  False
1   878 2007-10-02  2008-12-01  False
2   878 2008-12-02  2010-04-03  False
3   879 2010-04-04  2199-05-11  False
4   879 2016-05-12  2199-12-31  True

我的代码的灵感来自以下链接:

  • python中有效的日期范围重叠计算? https://stackoverflow.com/questions/9044084/efficient-date-range-overlap-calculation-in-python

  • 如何在Python中找到范围重叠? https://stackoverflow.com/questions/6821156/how-to-find-range-overlap-in-python


你可以直接改变to列并执行日期时间的直接减法。

df['overlap'] = (df['to'].shift()-df['from']) > timedelta(0)

在分组时应用此id可能看起来像

df['overlap'] = (df.groupby('id')
                   .apply(lambda x: (x['to'].shift() - x['from']) > timedelta(0))
                   .reset_index(level=0, drop=True))

Demo

>>> df
    id       from         to
0  878 2006-01-01 2007-10-01
1  878 2007-10-02 2008-12-01
2  878 2008-12-02 2010-04-03
3  879 2010-04-04 2199-05-11
4  879 2016-05-12 2199-12-31

>>> df['overlap'] = (df.groupby('id')
                       .apply(lambda x: (x['to'].shift() - x['from']) > timedelta(0))
                       .reset_index(level=0, drop=True))

>>> df
    id       from         to overlap
0  878 2006-01-01 2007-10-01   False
1  878 2007-10-02 2008-12-01   False
2  878 2008-12-02 2010-04-03   False
3  879 2010-04-04 2199-05-11   False
4  879 2016-05-12 2199-12-31    True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在python中查找日期范围重叠 的相关文章

随机推荐

  • 查找字符串的*最*常见前缀 - 更好的方法吗?

    我有一个钥匙列表 foo a foo b foo c fnord 这里所有类似的解决方案都假设您没有fnord在你的文字中 我有这个代码可以完成这项工作 def detect prefix keys PCT 0 70 cutof pre l
  • 获取“/”字符后的字符串

    我想在 PostgreSQL SELECT 查询中提取字符 后面的字符串 字段名称是source path 表名是movies history 数据示例 source path 的值 184738 file1 mov 194839 file
  • 将 MATLAB 绘图转换为图像

    我生成了一个类似的情节 figure hold axis 0 10 0 10 fill 1 1 5 5 5 1 1 5 b 现在我想将此图作为矩阵 以便我可以用高斯过滤博客 谷歌搜索我发现了这个线程将绘图光栅化为图像 http www ma
  • 如何在 Struts2 中检查 s:if 中的字符串不等式

    我在用
  • android OpenGL ES简单图块生成器性能问题

    遵循这个问题 老式 2D 类似塞尔达传说游戏的最佳方法 https stackoverflow com questions 2125354 best approach for oldschool 2d zelda like game 感谢之
  • 在 log(n) 时间内查找排序数组中至少出现 k 次的元素

    给定一个由 n 个元素和一个数字 k 组成的排序数组 是否有可能在 log n 时间内找到出现超过 k 次的元素 如果有多个数字出现超过 k 次 则其中任何一个都可以接受 如果是 怎么办 编辑 我能够在线性时间内解决这个问题 并且我很高兴在
  • 如何从命令行列出已安装的 MSI? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我们最近将 Windows 软件包从 RPM cygwin 切换到 MSI wix 拥有原生包装是一个非常受欢迎的变化 我们打算坚持下去 然而 MSI
  • 使用 JQuery 将事件处理程序添加到 iframe

    我想将 keydown 事件处理程序分配给 iframe 类似于纯JS的东西 document getElementById iframe id contentWindow addEventListener keydown funcName
  • 生成加权随机数

    我正在尝试设计一种 好的 方法从一系列可能的数字中选择一个随机数 其中该范围内的每个数字都被赋予一个权重 简单地说 给定数字范围 0 1 2 选择一个数字 其中 0 有 80 的概率被选中 1 有 10 的概率 2 有 10 的概率 自从我
  • Angular - Google 未定义?

    你好 我正在尝试实施google maps api in angular 这很简单angularjs但我不知道什么不起作用 我有一个简单的应用程序 它显示产品及其位置 单击位置后 该位置会显示在地图上 但我正在使用的购物地图google m
  • R 中曲线下增量面积 (iAUC)

    曲线下面积可以使用以下公式计算trapz的功能pracmaR iAUC 中的包在许多情况下更加准确 特别是在生物学中 然而据我所知 没有 R 函数可以计算这个 陷阱函数如下 Example a lt c 1 4 5 6 b lt c 2 4
  • 如何使用 apache 设置 mpeg dash 服务器?

    我想在 ubuntu 10 04 上设置本地 mpeg dash 服务器 那么分别安装apache和mpeg dash编码器后该怎么办呢 thanks 只需将 MPD 和破折号段放入 apache htdocs 文件夹即可 如果您的 MPD
  • Python 中使用 lxml 进行 Schematron 验证:如何检索验证错误?

    我正在尝试使用 lxml 进行一些 Schematron 验证 对于我正在处理的特定应用程序 重要的是报告任何未通过验证的测试 这lxml文档 http lxml de validation html提到了存在validation repo
  • ADB Shell 输入事件

    之间的基本区别是什么adb shell input keyevent and adb shell sendevent 我应该使用哪一个来输入字符 我们传递给这两个命令的键码是否相同 By adb shell input keyevent 或
  • 如何防止无名结构\联合?

    我正在构建一个具有矩阵数据联合的类 但是 只有当我没有结构 联合的名称时 我才能对其进行编译 但是 如果警告级别更高 视觉工作室为四级 我会发出警告说 warning C4201 nonstandard extension used nam
  • 帮助我验证 url 是否应该接受 .me 域

    var tomatch http A Za z0 9 3 A Za z 3 if tomatch test theurl window alert URL OK return true 我尝试了这个正则表达式代码来验证 url 当我尝试验证
  • 这段代码是否受 C 标准保证?

    我读过 如果你声明两个这样的结构 struct Node int a b c struct DerivedNode struct Node base int d e f 然后你可以像这样使用指向它们的指针 struct DerivedNod
  • tf.sign 如何与反向传播一起工作?

    我从 TensorFlow 开始 尝试创建一个二进制网络 更具体地说 我正在寻找一个哈希网络 它将图像编码为大小为 n 的二进制向量 所以我有一个经典的网络 我对softmax之前的最后一层进行二值化 TensorFlow 提供了一个tf
  • WCF/Silverlight:为什么使用 ChannelFactory 而不是客户端?

    在继承的项目中 使用 ChannelFactory 而不是 Client 进行 WCF 调用 为什么要这么做 另外 缓存 ChannelFactory CreateChannel 调用的结果是否安全 还是应该每次创建一个新的结果 创建 WC
  • 在python中查找日期范围重叠

    我试图找到一种更有效的方法来根据特定列 id 在数据框中查找重叠的数据范围 每行提供的开始 结束日期 数据框按 来自 列排序 我认为有一种方法可以避免双重apply像我一样运行 import pandas as pd from dateti