初学 Python — 处理日期与时间[1]

二、计算一段时间内的工作日天数,休息日不一定是传统意义上的周六周日,可能是任意某天或某两天等。

1 使用上节写好的函数,进行修改,让其可以找到两个日期间的星期X,同时会返回找到星期X的天数。

import datetime
import calendar
def FindWeekDay1(startdate,enddate,weekday):
    #分离出日期变量
    x=startdate.split('-')
    y=enddate.split('-')
    num=0
    oneday = datetime.timedelta(days=1)
    fristday = datetime.date(int (x[0]),int (x[1]),int (x[2]))
    lastday = datetime.date(int (y[0]),int (y[1]),int (y[2]))
    while (lastday-fristday).days >= 0:
            if fristday.weekday()==weekday-1:
                print(fristday.strftime('%A, %d-%b-%Y'))
                num+=1
                fristday += oneday*7
            else:
                fristday += oneday
    return num
2 定义函数计算工作日天数
<span style="color:#3333ff;">import sys
sys.path.append('c:\MyPython')
import FindWeekDay1
import datetime

def CountWorkDay(startdate,enddate,*sleepday):
    x=startdate.split('-')
    y=enddate.split('-')
    z=[];
    num=0
    oneday = datetime.timedelta(days=1)
    fristday = datetime.date(int (x[0]),int (x[1]),int (x[2]))
    lastday = datetime.date(int (y[0]),int (y[1]),int (y[2]))
    totalday = (lastday-fristday).days+1
    for i in range(0,len(sleepday)):
        totalday -= FindWeekDay1.FindWeekDay1(startdate,enddate,sleepday[i])
    return totalday
if __name__== "__main__":
    print(CountWorkDay('2014-10-01','2014-10-02',6,7))</span>
3 以上函数只能接收一种日期类型,即形如'2014-10-01’的字符串

4 if __name__ == "__main__":的含义是只当当前函数为主函数时才运行IF缩进内容。

5 为解决第3个问题,载入dateutil库,下载地址:https://pypi.python.org/pypi/python-dateutil,在其目录下Python setup.py install安装。修改CountWorkDay代码为:

<span style="color:#3333ff;">import datetime
import calendar
import dateutil.parser

def FindWeekDay1(startdate,enddate,weekday):
    #分离出日期变量
    num=0
    oneday = datetime.timedelta(days=1)
    fristday = dateutil.parser.parse(startdate)
    lastday = dateutil.parser.parse(enddate)
    while (lastday-fristday).days >= 0:
            if fristday.weekday()==weekday-1:
                print(fristday.strftime('%A, %d-%b-%Y'))
                num+=1
                fristday += oneday*7
            else:
                fristday += oneday
    return num</span>
6 dateutil.parser可以解析一些模糊的日期字符串,但会按照一定的优先度。

[1]  优先解析mm-dd-yy

[2]  其次解析dd-mm-yy 

[3]  再次解析yy-mm-dd 不解析yy-dd-mm

<span style="color:#3333ff;">datetime.datetime(2012, 12, 12, 0, 0)
>>> dateutil.parser.parse('10-11-12')
datetime.datetime(2012, 10, 11, 0, 0)
>>> dateutil.parser.parse('14-11-12')
datetime.datetime(2012, 11, 14, 0, 0)
>>> dateutil.parser.parse('45-11-12')</span><pre name="code" class="python"><span style="color:#3333ff;">datetime.datetime(2045, 11, 12, 0, 0)</span>
<pre name="code" class="python"><span style="color:#3333ff;">>>> dateutil.parser.parse('45-13-12')
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    dateutil.parser.parse('45-13-12')
  File "C:\Python34\lib\site-packages\python_dateutil-2.2-py3.4.egg\dateutil\parser.py", line 748, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "C:\Python34\lib\site-packages\python_dateutil-2.2-py3.4.egg\dateutil\parser.py", line 320, in parse
    ret = default.replace(**repl)
ValueError: month must be in 1..12</span>

 
 

[4]  该函数还能解析其他类型的日期字符串,如下

<span style="color:#6600cc;">>>> dateutil.parser.parse('99,12,17')
datetime.datetime(1999, 12, 17, 0, 0)
>>> dateutil.parser.parse('99,Dec,17')
datetime.datetime(1999, 12, 17, 0, 0)
>>> dateutil.parser.parse('99,17,DEc')
datetime.datetime(1999, 12, 17, 0, 0)
>>> dateutil.parser.parse('19900813')
datetime.datetime(1990, 8, 13, 0, 0)</span>


[5] 该函数只能处理字符串,因此可以定义函数DateToStr协助其处理数字型、元祖型等其他类型的日期,在此基础上修改以下以前的几个函数即可。

<span style="color:#3333ff;">import sys
import datetime
import dateutil.parser

def DateToStr(date):
    newdic={}
    if isinstance(date,int):
        date = str(date)
    elif isinstance(date,(list,tuple)):
        for i in date:
            date = "".join(str(date))
    return dateutil.parser.parse(date)</span>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值