如果在日期之间比较 2 个数据框以添加行

如何解决如果在日期之间比较 2 个数据框以添加行

这里是全新的,我尝试查找我的问题,但找不到任何非常相似的东西!

我正在尝试设置一个包含时间表及其活动类型数据的数据框。例如,如果它是“1”,它是一个正常的活动,如果它是“2”,它被取消,然后将该数据帧与另一个数据帧进行比较,以查看第一个数据帧中的开始/结束日期之间是否存在日期,如果是,将其修改为 3 行而不是 1 行,第一个开始/结束日期行直到该假期,假期日期行,然后是假期后继续的开始/结束日期。

我创建单个数据框没有问题,但是当我想比较另一个系列/数据框并可能添加可能位于所述 StartDate 和 EndDate 之间的行时,我的问题就出现了。

示例 调度数据帧

开始日期 结束日期 活动类型
2021-01-01 2021-12-31 1

与其他数据框相比

假期开始日期 假期结束日期
2021-02-14 2021-02-14
2021-07-04 2021-07-05

结局是这样的:

开始日期 结束日期 活动类型
2021-01-01 2021-02-13 1
2021-02-14 2021-02-14 2
2021-02-15 2021-07-03 1
2021-07-04 2021-07-04 2
2021-07-05 2021-12-31 1

感谢任何帮助!

谢谢,S。

解决方法

为了提供一个更有启发性的例子,我创建了 Schedule 作为包含 多行

  Start Date   End Date  Activity Type
0 2021-01-01 2021-05-31             10
1 2021-06-01 2021-12-31             20

我将假期创建为:

  Holiday Start Date Holiday End Date
0         2021-02-14       2021-02-14
1         2021-03-10       2021-03-12
2         2021-07-04       2021-07-06

所有日期列都是 datetime64 类型。

准备步骤是从 Holidays 创建一个 IntervalIndex

ind = pd.IntervalIndex.from_arrays(Holidays['Holiday Start Date'],Holidays['Holiday End Date'],closed='both')

要从单行获取结果,请创建以下函数:

def getActivities(row):
    dd = pd.date_range(row['Start Date'],row['End Date'])
    ss = dd.to_series().apply(lambda dat: ind.contains(dat).any())
    s1 = ss[ss != ss.shift()]
    s2 = ss[ss != ss.shift(-1)]
    s1 = s1.astype(int) + row['Activity Type']
    rv = s1.astype(int).reset_index().rename(columns={'index': 'Start Date',0: 'Activity Type'})
    rv.insert(1,'End Date',s2.index)
    return rv

要测试这个函数,你可以在一行上调用它,比如第一行:

getActivities(Schedule.iloc[0])

要完全了解所有详细信息,请在下面保存一行 Schedule 一个变量:

row = Schedule.iloc[0]

然后执行 getActivities 中的每条指令并查看中间结果。

并且要获得所有行的预期结果,您必须连接 将此函数应用于每一行的结果:

pd.concat(Schedule.apply(getActivities,axis=1).values,ignore_index=True)

对于我的测试数据,结果是:

  Start Date   End Date  Activity Type
0 2021-01-01 2021-02-13             10
1 2021-02-14 2021-02-14             11
2 2021-02-15 2021-03-09             10
3 2021-03-10 2021-03-12             11
4 2021-03-13 2021-05-31             10
5 2021-06-01 2021-07-03             20
6 2021-07-04 2021-07-06             21
7 2021-07-07 2021-12-31             20

前 5 行来自 Schedule0 行,有 2 个假期。 最后 3 行来自 1 行,有 1 个假期。

请注意,Activity Type 要么是原始值(对于“正常”期间) 或原始值 + 1(对于假期),因此 Schedule 不应 包含连续值作为活动类型

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?