【问题标题】:How can I check if the date lies between two dates coming from loop如何检查日期是否位于来自循环的两个日期之间
【发布时间】:2021-04-01 14:58:14
【问题描述】:

我被困在我试图检查日期是否在两个日期之间,日期来自带有 for 循环的 python 对象。

Date_from 是开始日期,例如 01-04-2021

date_to 是结束日期,例如 05-04-2021

check_in 是我要检查的日期,例如 03-04-2021

Python 代码:

if check_in.date() in ((d.date_from.date() for d in holidays) < ((d.date_to.date() for d in holidays))):
    print("date is in between")
else:
    print("Not in between")

我也试过这段代码,但没有成功。

if check_in.date() in ((d.date_from.date() for d in holidays) or ((d.date_to.date() for d in holidays))):
    print("date is in between")
else:
    print("Not in between")    

这里指的是URL source to check date lies in between two dates 我收到了这个错误。

TypeError:“生成器”和“生成器”实例之间不支持“

谁能指导我如何检查它?

【问题讨论】:

  • 你在一行代码中做的太多了。把它分成小块。如果您用文字描述您想采取的解决问题的步骤,这可能会有所帮助。将其简化为最基本的术语。您在这里所拥有的不是比较两个日期。
  • @Code-Apprentice 你能解释一下吗?我不清楚。那会很好。谢谢
  • 请更清楚地解释您要做什么。不用担心“循环”之类的技术细节,而是用文字解释实际问题。看起来您有一个假期列表和一个“入住”日期。什么是假期?我的意思是在美国,假期通常只有一天,但您似乎在这里为每个假期设置了“开始日期”和“结束日期”。你想对假期和入住日期做什么?您要解决的实际问题是什么?

标签: python python-3.x date


【解决方案1】:

您可以使用any 来测试holydays 的任何元素是否匹配:

any(d.date_from.date()<=check_in.date()<d.date_to.date() for d in holidays)

【讨论】:

  • 我只想为 OP 指出,这也会单独比较每个假期的入住日期。此外,any() 的用例取决于您是否想知道任何测试是否成功。如果您想对匹配的特定假期做某事,那么您将需要更多与我在回答中发布的内容相同的内容。 (这里的“你”是指OP)
【解决方案2】:

如果我理解正确,您正在尝试做这样的事情:

for each holiday
    is the checkin date between the holiday start date and the holiday end date

请注意我是如何完全用文字来写这个描述的。我使用类似于代码的格式,因为我有点超前思考,但重要的部分是用文字描述解决方案问题,完全不用担心python语法。

现在我们可以把这些词翻译成代码了:

# for each holiday
for d in holidays: 
    # is the checkin date between the holiday start date and the holiday end date
    if d.date_from < check_in < d.date_to:
        print("in between")
    else:
        print("not in between")

我认为您最初的尝试是尝试一次检查所有日期。相反,您需要遍历假期列表并一次检查一个日期。

【讨论】:

    【解决方案3】:

    我认为这应该做你想做的事:

    from datetime import date
    
    def convert_date(string_date):
        """Takes string date in format dd-mm-yyyy and returns a list of integers in format [yyyy, mm, dd]"""
    
        return reversed(list(map(int, string_date.split('-'))))
    
    # Create check in date object
    check_in_obj = date(*convert_date('03-04-2021'))
    
    for d in holidays:
        # set date obj for date_from and date_to
        date_from_obj = date(*convert_date(d.date_from.date()))
        date_to_obj = date(*convert_date(d.date_to.date()))
    
        if date_from_obj <= check_in_obj <= date_to_obj:
            print("date is in between")
            break
    else:
        print("Not in between")
    

    然而,这假设了几件事:

    1. “dd-mm-yyyy”格式的字符串是在您的对象上运行 .date() 返回的内容。
    2. 您只希望打印语句最后一次,以查看日期是否适合任何假期。

    所以我制作了一个小函数,用于将字符串日期转换为可用于制作datetime.date 对象的整数列表。然后,将您的日期作为date 对象,您只需比较上面链接的答案中显示的日期即可。

    请注意,最后一个 else 语句用于 for 循环。

    让我知道这是否适合你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 2017-07-07
      • 1970-01-01
      • 2013-04-11
      • 2013-11-08
      • 1970-01-01
      相关资源
      最近更新 更多