python next day_关于Datetime Python:Datetime Python-下一个工作日

两个相关的问题:(1)我使用的所有数据都附加了工作日日期。 在不同的时候,我需要知道下一个工作日是什么。 我已经写了类似下面的代码来确定这一点,但是我敢肯定有更好的方法。 任何人? (2)理想情况下,我不仅需要知道下一个工作日,还需要知道下一个美国工作日,也就是说,不是美国市场假期的下一个工作日。 在这方面的任何帮助也将是巨大的。

import datetime as dt

day = dt.datetime.strptime('2012-02-03','%Y-%m-%d').date()

print day#day=2012-03-02 (Friday)

if day.weekday()==4:

day = day+dt.timedelta(days=3)

else:

day = day+dt.timedelta(days=1)

print day#day=2012-02-06 (Monday)

day = day+dt.timedelta(days=1)

print day#day=2012-02-07 (Tuesday)

可能的帮助:stackoverflow.com/questions/2224742/business-days-in-python

我会使用dateutil.rrule:

import datetime

from dateutil import rrule

holidays = [

datetime.date(2012, 5, 1,),

datetime.date(2012, 6, 1,),

# ...

]

# Create a rule to recur every weekday starting today

r = rrule.rrule(rrule.DAILY,

byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR],

dtstart=datetime.date.today())

# Create a rruleset

rs = rrule.rruleset()

# Attach our rrule to it

rs.rrule(r)

# Add holidays as exclusion days

for exdate in holidays:

rs.exdate(exdate)

print rs[0]

我用了假期套餐。

$ pip install holidays

这是我用来确定今天之后的下一个工作日的功能。

import datetime

import holidays

ONE_DAY = datetime.timedelta(days=1)

HOLIDAYS_US = holidays.US()

def next_business_day():

next_day = datetime.date.today() + ONE_DAY

while next_day.weekday() in holidays.WEEKEND or next_day in HOLIDAYS_US:

next_day += ONE_DAY

return next_day

如果明天不是周末而不是假期,它将返回明天的日期。否则,它将在第二天找到不是这些东西中的任何一个。示例运行于2017年3月15日星期三:

>>> next_business_day()

datetime.date(2017, 3, 16)

*警告,如果卡马乔总统宣布每天放假,这可能会无限循环。

这个问题很常见,并且有不同级别的解决方案:

最简单:使用类似您检查工作日的方法。一种常见的偶像是

d = datetime.date(2012,2,7)

next = d + datetime.timedelta(days= 7-d.weekday() if d.weekday()>3 else 1)

如果您想要放假,则可以滚动自己的日期时间" TradingDateChecker",该日期时间必须扫描"可预测的"放假,例如1月1日,7月4日,12月25日(如果在周末之前的下一个周五或下周一),上周一五月,九月的第一个星期一等

我什至都不会在这里张贴该代码,因为对于交易假期,它仍然是不够的。

耶稣受难日,纽约证券交易所关闭,期货和债券市场开放

哥伦布日和退伍军人节,银行关闭,股票市场开放。

股票和期货市场有不同的假期。如果您想要纽约证券交易所假期(常见要求),请参见下文。您无法真正保留自己的日历,因为通常只在未来几年宣布关闭日期。

# For a longer list of NYSE closed dates see: http://www.chronos-st.org/NYSE_Observed_Holidays-1885-Present.html

holidays = [datetime.date(2000, 1, 17),

datetime.date(2000, 2, 21),

datetime.date(2000, 4, 21),

datetime.date(2000, 5, 29),

datetime.date(2000, 7, 4),

datetime.date(2000, 9, 4),

datetime.date(2000, 11, 23),

datetime.date(2000, 12, 25),

datetime.date(2001, 1, 1),

datetime.date(2001, 1, 15),

datetime.date(2001, 2, 19),

datetime.date(2001, 5, 28),

datetime.date(2001, 7, 4),

datetime.date(2001, 9, 3),

datetime.date(2001, 9, 11),

datetime.date(2001, 9, 12),

datetime.date(2001, 9, 13),

datetime.date(2001, 9, 14),

datetime.date(2001, 11, 22),

datetime.date(2001, 12, 25),

datetime.date(2002, 1, 1),

datetime.date(2002, 1, 21),

datetime.date(2002, 2, 18),

datetime.date(2002, 3, 29),

datetime.date(2002, 5, 27),

datetime.date(2002, 7, 4),

datetime.date(2002, 9, 2),

datetime.date(2002, 11, 28),

datetime.date(2002, 12, 25),

datetime.date(2003, 1, 1),

datetime.date(2003, 1, 20),

datetime.date(2003, 2, 17),

datetime.date(2003, 4, 18),

datetime.date(2003, 5, 26),

datetime.date(2003, 7, 4),

datetime.date(2003, 9, 1),

datetime.date(2003, 11, 27),

datetime.date(2003, 12, 25),

datetime.date(2004, 1, 1),

datetime.date(2004, 1, 19),

datetime.date(2004, 2, 16),

datetime.date(2004, 4, 9),

datetime.date(2004, 5, 31),

datetime.date(2004, 6, 11),

datetime.date(2004, 7, 5),

datetime.date(2004, 9, 6),

datetime.date(2004, 11, 25),

datetime.date(2004, 12, 24),

datetime.date(2005, 1, 17),

datetime.date(2005, 2, 21),

datetime.date(2005, 3, 25),

datetime.date(2005, 5, 30),

datetime.date(2005, 7, 4),

datetime.date(2005, 9, 5),

datetime.date(2005, 11, 24),

datetime.date(2005, 12, 26),

datetime.date(2006, 1, 2),

datetime.date(2006, 1, 16),

datetime.date(2006, 2, 20),

datetime.date(2006, 4, 14),

datetime.date(2006, 5, 29),

datetime.date(2006, 7, 4),

datetime.date(2006, 9, 4),

datetime.date(2006, 11, 23),

datetime.date(2006, 12, 25),

datetime.date(2007, 1, 1),

datetime.date(2007, 1, 2),

datetime.date(2007, 1, 15),

datetime.date(2007, 2, 19),

datetime.date(2007, 4, 6),

datetime.date(2007, 5, 28),

datetime.date(2007, 7, 4),

datetime.date(2007, 9, 3),

datetime.date(2007, 11, 22),

datetime.date(2007, 12, 25),

datetime.date(2008, 1, 1),

datetime.date(2008, 1, 21),

datetime.date(2008, 2, 18),

datetime.date(2008, 3, 21),

datetime.date(2008, 5, 26),

datetime.date(2008, 7, 4),

datetime.date(2008, 9, 1),

datetime.date(2008, 11, 27),

datetime.date(2008, 12, 25),

datetime.date(2009, 1, 1),

datetime.date(2009, 1, 19),

datetime.date(2009, 2, 16),

datetime.date(2009, 4, 10),

datetime.date(2009, 5, 25),

datetime.date(2009, 7, 3),

datetime.date(2009, 9, 7),

datetime.date(2009, 11, 26),

datetime.date(2009, 12, 25),

datetime.date(2010, 1, 1),

datetime.date(2010, 1, 18),

datetime.date(2010, 2, 15),

datetime.date(2010, 4, 2),

datetime.date(2010, 5, 31),

datetime.date(2010, 7, 5),

datetime.date(2010, 9, 6),

datetime.date(2010, 11, 25),

datetime.date(2010, 12, 24),

datetime.date(2011, 1, 17),

datetime.date(2011, 2, 21),

datetime.date(2011, 4, 22),

datetime.date(2011, 5, 30),

datetime.date(2011, 7, 4),

datetime.date(2011, 9, 5),

datetime.date(2011, 11, 24),

datetime.date(2011, 12, 26),

datetime.date(2012, 1, 2),

datetime.date(2012, 1, 16),

datetime.date(2012, 2, 20),

datetime.date(2012, 4, 6),

datetime.date(2012, 5, 28),

datetime.date(2012, 7, 4),

datetime.date(2012, 9, 3),

datetime.date(2012, 11, 22),

datetime.date(2012, 12, 25),

datetime.date(2013, 1, 1),

datetime.date(2013, 1, 21),

datetime.date(2013, 2, 18),

datetime.date(2013, 3, 29),

datetime.date(2013, 5, 27),

datetime.date(2013, 7, 4),

datetime.date(2013, 9, 2),

datetime.date(2013, 11, 28),

datetime.date(2013, 12, 25)]

没有ifs的另一种方式是:

def next_wk_day():

date_today = datetime.datetime.today()

shift = 1 + ((date_today.weekday()//4)*(6-date_today.weekday()))

return(date_today+shift)

如果您在星期六或星期日这样做,也可以使用。

或更简单:return date_today + [1, 1, 1, 1, 3, 2, 1][date_today.weekday()]尽管这些公式忽略假日。

做一个以上的工作日

def next_business_day(start_day, business_days, HOLIDAYS):

ONE_DAY = datetime.timedelta(days=1)

temp_day = start_day

for i in range(0, business_days):

next_day = temp_day + ONE_DAY

while next_day.weekday() in [5,6] or next_day in HOLIDAYS:

next_day += ONE_DAY

temp_day = next_day

return temp_day

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值