首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python检查日期范围内的两个日期

Python检查日期范围内的两个日期
EN

Stack Overflow用户
提问于 2020-01-14 17:36:52
回答 2查看 398关注 0票数 0

我需要检查这两个日期,而不是名单上的任何日期范围。

我想知道can用户签入日期(check_range_true - can,check_range_false -不能)或这个已经预订的日期(date_ranges中)

我的射程看上去像:

代码语言:javascript
运行
复制
date_ranges = [
    ['2020-1-12', '2020-1-13'],
    ['2020-1-14', '2020-1-15'],
    ['2020-1-15', '2020-1-16'],
    ['2020-1-16', '2020-1-18'],
    ['2020-1-18', '2020-1-19'],
    ['2020-1-21', '2020-1-23'],
    ['2020-1-23', '2020-1-27'],
    ['2020-1-30', '2020-2-1'],
    ['2020-2-5', '2020-2-7'],
    ['2020-2-7', '2020-2-9'],
    ['2020-2-9', '2020-2-11'],
    ['2020-2-14', '2020-2-18'],
    ['2020-2-20', '2020-2-26'],
    ['2020-3-26', '2020-3-30'],
    ['2020-5-29', '2020-5-30'],
    ['2020-10-10', '2021-1-15']
]

和两个日期(例如)

代码语言:javascript
运行
复制
check_range_true = ['2020-02-02', '2020-02-04']
check_range_false = ['2020-02-02', '2020-02-05']

我知道如何在范围内检查一个日期,但不知道如何用两个日期来解决它。

在一个范围内检查这些日期并得到结果的最佳方法是什么,第一个变量的True (因为2020-02-02,2020-02-04没有“触摸”范围)和第二个变量的False (因为2020-02-05的范围是'2020-2-5','2020-2-7')?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-14 18:24:06

您要做的是使用(start < first_date < end)和(start < end_date < end)逻辑检查日期。

代码语言:javascript
运行
复制
date_ranges = [
    ['2020-1-12', '2020-1-13'],
    ['2020-1-14', '2020-1-15'],
    ['2020-1-15', '2020-1-16'],
    ['2020-1-16', '2020-1-18'],
    ['2020-1-18', '2020-1-19'],
    ['2020-1-21', '2020-1-23'],
    ['2020-1-23', '2020-1-27'],
    ['2020-1-30', '2020-2-1'],
    ['2020-2-5', '2020-2-7'],
    ['2020-2-7', '2020-2-9'],
    ['2020-2-9', '2020-2-11'],
    ['2020-2-14', '2020-2-18'],
    ['2020-2-20', '2020-2-26'],
    ['2020-3-26', '2020-3-30'],
    ['2020-5-29', '2020-5-30'],
    ['2020-10-10', '2021-1-15']
]
#convert to a flat list
date_ranges = [k for i in date_ranges for k in i]
#truncate the start and the end value    
date_ranges = date_ranges[1:-1]
#convert values to datetime
import datetime
date_ranges = [datetime.datetime.strptime(i, '%Y-%m-%d') for i in date_ranges]
#create available time slots
date_ranges = [[date_ranges[i],date_ranges[i+1]] for i in range(0,len(date_ranges),2)]

#convert the check date to date time
check_range = ['2020-02-02', '2020-02-04']
check_range = [datetime.datetime.strptime(i, '%Y-%m-%d') for i in check_range]

# apply the logic of start < date < end twice
any([(i[0] < check_range[0] < i[1]) and (i[0] < check_range[1] < i[1]) for i in date_ranges])
True

check_range = ['2020-02-02', '2020-02-05']
check_range = [datetime.datetime.strptime(i, '%Y-%m-%d') for i in check_range]

any([(i[0] < check_range[0] < i[1]) and (i[0] < check_range[1] < i[1]) for i in date_ranges])

False
票数 1
EN

Stack Overflow用户

发布于 2020-01-14 22:43:43

如果我正确理解这一点,您希望检查给定的日期范围(例如,check_range_true)是否与列表中指定的任何其他日期范围重叠(或不重叠)。为了实现这一点,我首先将字符串值转换为适当的datetime对象,以便更容易地进行日期比较。这可以通过列表理解和strptime来实现。

代码语言:javascript
运行
复制
from datetime import datetime

booked_date_ranges = [
    [datetime.strptime(start_date, '%Y-%m-%d'), datetime.strptime(end_date, '%Y-%m-%d')]
    for start_date, end_date in date_ranges
]

然后我将创建一个函数,它将检查提供的日期范围(包括开始日期和结束日期)是否与以前指定的列表中的任何日期范围重叠。您需要检查开始日期是在日期范围之间还是结束日期在日期范围之间。这将是一种类似于这样的东西:

代码语言:javascript
运行
复制
def dates_overlap(date_range_to_check, booked_date_ranges):
    dates = [datetime.strptime(date, '%Y-%m-%d') for date in date_range_to_check]
    return any(
        (start_date <= dates[0] and dates[0] <= end_date) or (start_date <= dates[1] and dates[1] <= end_date)
        for start_date, end_date in booked_date_ranges
    )

然后,如果要检查给定的日期范围是否重叠,只需使用dates_overlap函数并否定结果:

代码语言:javascript
运行
复制
>>> not dates_overlap(check_range_false, booked_date_ranges)
False
>>> not dates_overlap(check_range_true, booked_date_ranges)
True

我希望这能回答你的问题。当然,这只是一个草案,肯定有一些改进的空间,但应该是一个工作的解决方案,给出的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59739044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档