Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找给定日期后第一个星期一的日期_Python_Date - Fatal编程技术网

Python 查找给定日期后第一个星期一的日期

Python 查找给定日期后第一个星期一的日期,python,date,Python,Date,给定一个特定的日期,比如2011-07-02,我如何找到该日期之后的下周一(或任何工作日)的日期?import datetime import datetime def next_weekday(d, weekday): days_ahead = weekday - d.weekday() if days_ahead <= 0: # Target day already happened this week days_ahead += 7 retur

给定一个特定的日期,比如2011-07-02,我如何找到该日期之后的下周一(或任何工作日)的日期?

import datetime
import datetime
def next_weekday(d, weekday):
    days_ahead = weekday - d.weekday()
    if days_ahead <= 0: # Target day already happened this week
        days_ahead += 7
    return d + datetime.timedelta(days_ahead)

d = datetime.date(2011, 7, 2)
next_monday = next_weekday(d, 0) # 0 = Monday, 1=Tuesday, 2=Wednesday...
print(next_monday)
def下个工作日(d,工作日): 提前天数=工作日-d.工作日() 如果未来几天试试看


使用,下一个星期一是星期一之后的7天,星期二之后的6天,依此类推,还使用Python的
datetime
将星期一报告为
0
,…,星期天报告为
6
,,您可以开始向date对象添加一天,并在星期一停止

>>> d = datetime.date(2011, 7, 2)
>>> while d.weekday() != 0: #0 for monday
...     d += datetime.timedelta(days=1)
... 
>>> d
datetime.date(2011, 7, 4)

这将给出给定日期后的第一个下周一:

import datetime

def get_next_monday(year, month, day):
    date0 = datetime.date(year, month, day)
    next_monday = date0 + datetime.timedelta(7 - date0.weekday() or 7)
    return next_monday

print get_next_monday(2011, 7, 2)
print get_next_monday(2015, 8, 31)
print get_next_monday(2015, 9, 1)
2011-07-04
2015-09-07

2015-09-07通过列表理解

from datetime import *
[datetime.today()+timedelta(days=x) for x in range(0,7) if (datetime.today()+timedelta(days=x)).weekday() % 7 == 0]

(0 at the end is for next monday, returns current date when run on monday)

这里有一个简洁和通用的替代方案,以取代上面略显沉重的答案

# Returns the date of the next given weekday after
# the given date. For example, the date of next Monday.
# NB: if it IS the day we're looking for, this returns 0.
# consider then doing onDay(foo, day + 1).
onDay = lambda date, day: date + datetime.timedelta(days=(day-date.weekday()+7)%7)

另一个简单而优雅的解决方案是使用偏移量。
我发现在玩约会时,它非常有用而且非常健壮。
-如果您想要第一个星期天,只需将频率修改为freq='W-SUN'。
-如果您想在接下来的几个星期天,请更改偏移量.Day(天)。
-使用此功能,您可以忽略假期,只在工作日或更多时间工作。
您还可以使用apply方法在整个数据帧上轻松地应用此方法

# Getting the closest monday from a given date
closest_monday = pd.date_range(start=date, end=date + offsets.Day(6), freq='W-MON')[0]

# Adding a 'ClosestMonday' column with the closest monday for each row in a pandas df using apply
# Require you to have a 'Date' column in your df
def get_closest_monday(row):
    return pd.date_range(start=row.Date, end=row.Date + offsets.Day(6), freq='W-MON')[0]

df['ClosestMonday'] = df.apply(lambda row: get_closest_monday(row), axis=1)

这是环
mod 7
内的计算示例

导入日期时间
def下一天(给定日期,工作日):
day_shift=(工作日-给定的_date.weekday())%7
返回给定的日期+日期时间.timedelta(天=日班)
现在=日期时间。日期(2018年4月15日)#周日
名称=[“星期一”、“星期二”、“星期三”、“星期四”、“星期五”,
“星期六”、“星期日”]
对于范围(7)内的工作日:
打印(姓名[工作日],下一天(现在,工作日))
将打印:

monday 2018-04-16
tuesday 2018-04-17
wednesday 2018-04-18
thursday 2018-04-19
friday 2018-04-20
saturday 2018-04-21
sunday 2018-04-15
正如你所看到的,下周一、周二、周三、周四、周五和周六是正确的。它还了解到,
2018-04-15
是一个星期日,并返回当前星期日而不是下一个星期日


我相信7年后你会发现这个答案非常有用;-)

另一种选择是使用rrule

from dateutil.rrule import rrule, WEEKLY, MO
from datetime import date

next_monday = rrule(freq=WEEKLY, dtstart=date.today(), byweekday=MO, count=1)[0]

rrule docs:

有趣的是,当我试图用“datetime(2013,1,1)+timedelta(days=(7-datetime(2013,1,1).weekday())”查找datetime(2013,1,1)之后即将到来的周日时,我得到了“datetime.datetime(2013,1,7,0,0)”,这是一个星期一。@fixxer-正如它在回答中所说的:代码以某种方式使用了
datetime
API的一些属性,这只有在您寻找星期一时才起作用。
phihag
提供的代码更通用,可以找到任何即将到来的一周中的一天。您认为在timedelta中使用6而不是7会有帮助吗?@fixxer:为什么不直接使用
phihag
提供的代码呢?它可以做你想做的:
下一个工作日(datetime.date(2013,1,1),6)
日期时间.date(2013,1,6)
,一个星期天。我的代码在(ab)中使用python的
datetime
API的某些属性是“可爱”的,只回答了问题的“查找下一个星期一”部分,但不够笼统,无法回答“查找下一个xxxday”问题。@fixxer:要使用“可爱”代码查找下一个星期天:
d+timedelta(6-d.weekday()或13-d.weekday())
(如果
Sunday==6
是一周的最后一天,那么它相当于phihag的代码)您也可以执行
((day-today)+7)%7
来获得当天的时间diff@jstaab或者简化为
(每天-今天)%7
。减法中的负面结果将按预期处理。例如
-1%7
给出
6
。此答案来得太晚,无法收集选票,但它是我的最爱。清除,但需要两个提醒。1.如果工作日与日期匹配,则返回相同的日期。工作日()2.工作日应在工作日()中格式,不是isoweekday(),但是当您使用
%7
时,
+7
是不必要的。将其更改为:
onDay=lambda date,day:date+datetime.timedelta(days=(day date date.weekday())%7)
,因为Python的
datetime
包有一个
date
类(我个人经常导入),我将
date
视为关键字,不命名变量
date
。我会将其更改为:
onDay=lambda dt,day:dt+datetime.timedelta(days=(day dt.weekday())%7)
以提醒自己输入的格式是Python
datetime.date
变量。(同样,在Javascript中,
date
是一种标准类型,您不应该命名变量
date
)来解决bhtabor的问题:1.为了确保返回下周的星期一,即使
date
本身是星期一,也要更改为
onDay=lambda date,day:date+datetime.timedelta(days=(day-date.weekday()-1)%7+1)
。不太重要的是:2.将
日期.工作日()
更改为
日期.isoweekday()
如果
日期
应该是值1..7,而不是周一..Sunday的0..6。是的,
日期范围
+
周一
+
偏移量。对于“过去和现在固定日期之间的每周一”的查询,第(6)天是一个优雅的解决方案,无需手动调整工作日。谢谢!此答案应该有更多投票权。
import datetime

d = datetime.date(2011, 7, 2)
while d.weekday() != 0:
    d += datetime.timedelta(1)
monday 2018-04-16
tuesday 2018-04-17
wednesday 2018-04-18
thursday 2018-04-19
friday 2018-04-20
saturday 2018-04-21
sunday 2018-04-15
from dateutil.rrule import rrule, WEEKLY, MO
from datetime import date

next_monday = rrule(freq=WEEKLY, dtstart=date.today(), byweekday=MO, count=1)[0]