如何在两个日期之间添加日期范围-Python

如何在两个日期之间添加日期范围-Python,python,pandas,date-range,Python,Pandas,Date Range,我想处理几天之间的时间重叠。正如您在我的df中所看到的,我从2019-10-25开始,到2019-10-27结束: begin end info 2019-10-25 10:39:58.352073 2019-10-25 10:40:06.266782 toto 2019-10-25 16:35:22.485574 2019-10-27 09:50:31.713179 tata <--

我想处理几天之间的时间重叠。正如您在我的df中所看到的,我从2019-10-25开始,到2019-10-27结束:

begin                       end                          info
2019-10-25 10:39:58.352073  2019-10-25 10:40:06.266782   toto
2019-10-25 16:35:22.485574  2019-10-27 09:50:31.713179   tata <------ HERE
2019-10-27 09:50:31.713179  2019-10-27 09:50:31.713192   titi
2019-10-28 14:04:33.095633  2019-10-28 14:05:07.639344   tete
  • 如果开始日期与结束日期不同,那么=>计算天数
  • 保留开始并添加新的结束“date 23:59:59.9”
  • 添加与天数相对应的新日期范围
  • 结束并添加新的开始“日期00:00:00.0”
  • 填写“信息”
最终预期结果:

begin                       end                          info
2019-10-25 10:39:58.352073  2019-10-25 10:40:06.266782   toto

2019-10-25 16:35:22.485574  2019-10-25 23:59:59.999999   tata
2019-10-26 00:00:00.000000  2019-10-26 23:59:59.999999   tata
2019-10-27 00:00:00.000000  2019-10-27 09:50:31.713179   tata

2019-10-27 09:50:31.713179  2019-10-27 09:50:31.713192   titi
2019-10-28 14:04:33.095633  2019-10-28 14:05:07.639344   tete
但我不知道如何实现日期范围、填充信息、添加特定行数


感谢您的时间

假设
开始
结束
已经是
时间戳
类型:

# Generate a series of Timedeltas for each row
n = (
    (df['end'].dt.normalize() - df['begin'].dt.normalize())
        .apply(lambda d: [pd.Timedelta(days=i) for i in range(d.days+1)])
        .explode()
).rename('n')
df = df.join(n)

# Adjust the begin and end of each row
adjusted_begin = np.max([
    df['begin'],
    df['begin'].dt.normalize() + df['n']
], axis=0)

adjusted_end = np.min([
    df['end'],
    pd.Series(adjusted_begin).dt.normalize() + pd.Timedelta(days=1, milliseconds=-100)
], axis=0)

# Final assembly
df = df.assign(begin_=adjusted_begin, end_=adjusted_end)
结果:

                       begin                        end  info      n                     begin_                       end_
0 2019-10-25 10:39:58.352073 2019-10-25 10:40:06.266782  toto 0 days 2019-10-25 10:39:58.352073 2019-10-25 10:40:06.266782
1 2019-10-25 16:35:22.485574 2019-10-27 09:50:31.713179  tata 0 days 2019-10-25 16:35:22.485574 2019-10-25 23:59:59.900000
1 2019-10-25 16:35:22.485574 2019-10-27 09:50:31.713179  tata 1 days 2019-10-26 00:00:00.000000 2019-10-26 23:59:59.900000
1 2019-10-25 16:35:22.485574 2019-10-27 09:50:31.713179  tata 2 days 2019-10-27 00:00:00.000000 2019-10-27 09:50:31.713179
2 2019-10-27 09:50:31.713179 2019-10-27 09:50:31.713192  titi 0 days 2019-10-27 09:50:31.713179 2019-10-27 09:50:31.713192
3 2019-10-28 14:04:33.095633 2019-10-28 14:05:07.639344  tete 0 days 2019-10-28 14:04:33.095633 2019-10-28 14:05:07.639344

如果
开始
结束
已经是
时间戳
类型,则修剪不需要的列

# Generate a series of Timedeltas for each row
n = (
    (df['end'].dt.normalize() - df['begin'].dt.normalize())
        .apply(lambda d: [pd.Timedelta(days=i) for i in range(d.days+1)])
        .explode()
).rename('n')
df = df.join(n)

# Adjust the begin and end of each row
adjusted_begin = np.max([
    df['begin'],
    df['begin'].dt.normalize() + df['n']
], axis=0)

adjusted_end = np.min([
    df['end'],
    pd.Series(adjusted_begin).dt.normalize() + pd.Timedelta(days=1, milliseconds=-100)
], axis=0)

# Final assembly
df = df.assign(begin_=adjusted_begin, end_=adjusted_end)
结果:

                       begin                        end  info      n                     begin_                       end_
0 2019-10-25 10:39:58.352073 2019-10-25 10:40:06.266782  toto 0 days 2019-10-25 10:39:58.352073 2019-10-25 10:40:06.266782
1 2019-10-25 16:35:22.485574 2019-10-27 09:50:31.713179  tata 0 days 2019-10-25 16:35:22.485574 2019-10-25 23:59:59.900000
1 2019-10-25 16:35:22.485574 2019-10-27 09:50:31.713179  tata 1 days 2019-10-26 00:00:00.000000 2019-10-26 23:59:59.900000
1 2019-10-25 16:35:22.485574 2019-10-27 09:50:31.713179  tata 2 days 2019-10-27 00:00:00.000000 2019-10-27 09:50:31.713179
2 2019-10-27 09:50:31.713179 2019-10-27 09:50:31.713192  titi 0 days 2019-10-27 09:50:31.713179 2019-10-27 09:50:31.713192
3 2019-10-28 14:04:33.095633 2019-10-28 14:05:07.639344  tete 0 days 2019-10-28 14:04:33.095633 2019-10-28 14:05:07.639344
修剪掉你不需要的柱子