首页 文章

Python:查找从今天前两个月开始的日期,并在星期一开始

提问于
浏览
2

所以我是python的初学者,并且一直在使用datetime,time和timedelta库 . 我正在尝试创建一段代码,从大约两个月前开始给我约会(exact_two_months_date)(今天无论如何) . 问题是,我想找到约会日期 . 两个月前,并在该周的星期一开始实际的start_date . 因此从理论上讲,实际开始日期不会恰好是两个月前 . 这将是从两个月前的星期一开始的一周 .

Example pseudocode:
    today = '20150425' ## '%Y%m%d' ... Saturday
    exact_two_months_date = '20150225' ## EXACTLY two months ago ... Wednesday
    start_date = '20150223' ## this is the Monday of that week two months ago

那么如何找到上面的'start_date'?如果恰好两个月前的那一天是在周六或周日开始,那么我只想去下周一 . 希望这是明确的,也是有道理的...一旦我找到开始日期,我想逐日(仅工作日)增加到'today' .
感谢任何反馈,谢谢 .

4 回答

  • 1

    Calculating with dates using python-dateutil
    如果依赖于第三方包是一个选项,那么☞ python-dateutil提供了一种方便的方法来计算日期 .

    浏览☞ relativedelta的文档以查看大量支持的参数 . 一个包需要对日期进行的计算越多,像 dateutil 这样的辅助模块就越能证明它的依赖性 . 有关它所提供的内容的更多灵感,请参阅☞ examples page .

    Quick run-through:

    >>> import datetime
    >>> from dateutil.relativedelta import relativedelta
    
    >>> today = datetime.date.today()
    >>> two_m_ago = today - relativedelta(months=2)
    >>> # print two_m_ago ~> datetime.date(2015, 2, 25)
    
    >>> monday = two_m_ago - datetime.timedelta(days=two_m_ago.weekday())
    >>> # print monday ~> datetime.date(2015, 2, 23)
    

    Getting the Monday with weekday()
    一旦我们从两个月前的变量 two_m_ago 中得到日期,我们就从中减去 weekday() 的索引 . 这个索引是周一的 0 ,一直到周日的 6 . 如果 two_m_ago 已经是星期一,那么减去 0 将不会导致任何更改 .

  • 1

    这样的事情对你有用吗?

    import datetime
    
    today = datetime.date.today()
    delta = datetime.timedelta(days=60) # ~ 2 months
    
    thatDay = today - delta
    # subtract weekdays to get monday
    thatMonday = thatDay - datetime.timedelta(days=thatDay.weekday())
    
  • 3

    老实说,我觉得和_974820一起工作是我经常做的最困难的事情而且我犯了很多错误,所以我要解决这个问题并展示我经常遇到的一些失误 . 开始 .

    两个限制:1)两个月前的日期,2)该周的星期一

    Date Two Months Ago

    好的,所以Python的 datetime 库有一个名为 replace 的有用方法,这似乎对它有帮助:

    >>> import datetime
    >>> now = datetime.date.today()
    >>> today
    datetime.date(2015, 4, 25)
    >>> today.month
    4
    >>> two_months_ago = today.replace(month=today.month-2)
    >>> two_months_ago
    datetime.date(2015, 2, 25)
    >>> two_months_ago.month
    2
    

    但是等一下:负面数字怎么样?这不起作用:

    >>> older = datetime.date(2015, 01, 01)
    >>> older.replace(month=older.month-2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: month must be in 1..12
    

    所以有两种解决方案:

    1)我可以构建一个向前或向后循环的1-12范围,或者

    2)为了找到前两个月,我只能用我所在月份的 1st 日替换我日期的 day 部分,然后返回1个月到上个月,然后用上一个月的那一天替换上个月的那一天 . 我想要的一天 .

    (如果你考虑一下,你会发现,如果我在一个月的第31天降落,那么其中任何一个都可能会出现错误,例如 . 这是因为这很困难 . )

    def previous_month(date):
        current_day = date.day
        first_day = date.replace(day=1)
        last_day_prev_month = first_day - datetime.timedelta(days=1)
        prev_month_day = last_day_prev_month.replace(day=current_day)
        return prev_month_day
    
    >>> today = datetime.date.today()
    >>> older = previous_month(today)
    >>> older
    datetime.date(2015, 3, 25)
    

    好吧,让我们说我们已经接近了,我们需要包括一些错误检查,以确保我们想要的那一天是我们登陆的月份内的有效日期 . 最终,问题是“两个月前”当我们大声说出来时,意味着比我们想象的更多 .

    接下来,我们将对第二个问题进行分析:如何到达那周的星期一?

    那么, datetime 对象有一个工作日方法,所以这部分不应该太难和here's a nice SO answer on how to do that .

    简单版本是:使用工作日整数的差异来计算使用 datetime.timedelta(days=days_difference) 返回的天数 .

    外卖:使用 datetime 可能很难 .

  • 0

    Python中的日期操作非常令人费解 . 使用arrow软件包可以节省大量时间,从而大大简化了这些操作 .

    首先安装它

    pip install arrow
    

    现在你的问题:

    import arrow
    
    # get local current time
    now = arrow.now('local')
    
    # move 2 months back
    old = now.replace(months=-2)
    
    # what day of the week was that?
    dow = old.isoweekday()
    
    # reset old to Monday, for instance at 9:32 in the morning (this is just an example, just to show case)
    old = old.replace(days=-dow, hour=9, minute=32, second=0)
    
    print('now is {now}, we went back to {old}'.format(now=now.isoformat(), old=old.isoformat()))
    

    输出:

    now is 2015-04-25T20:37:38.174000+02:00, we went back to 2015-02-22T09:32:00.174000+01:00
    

    请注意,各种格式,时区等现在都是透明的,您只需要依赖一个包 .

相关问题