Python标准库time,datetime,calendar,random的使用

time 库

基础概念

  1. 时间戳
    格林威治时间1970年01月01日00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
    Python中获取时间的常用方法是,先得到时间戳,再将其转换成想要的时间格式。
  2. 元组struct_time
    日期、时间是包含许多变量的,所以在Python中定义了一个元组struct_time将所有这些变量组合在一起,包括:4位数年、月、日、小时、分钟、秒等。
  3. UTC(Coordinated Universal Time,世界协调时)
    也叫格林威治天文时间,是世界标准时间.在我国为UTC+8
  4. DST(Daylight Saving Time)
    即夏令时。
  5. 一些实时函数的计算精度可能不同

变量总结如下表所示:

序号 字段
0 四位数年 2008
1 1-12
2 1-31
3 小时 0-23
4 分钟 0-59
5 0-61 (60或61 是闰秒)
6 一周的第几日 0-6 (0是周一)
7 一年的第几日 1到366 (儒略历)
8 夏令时 -1, 0, 1, -1是决定是否为夏令时的旗帜

对应的,struct_time元组的属性如下:

序号 属性
0 tm_year 2008
1 tm_mon 1-12
2 tm_mday 1-31
3 tm_hour 0-23
4 tm_min 0-59
5 tm_sec 0-61 (60或61 是闰秒)
6 tm_wday 0-6 (0是周一)
7 tm_yday 1到366 (儒略历)
8 tm_isdst -1, 0, 1, -1是决定是否为夏令时的旗帜

time库函数汇总

time.altzone

返回格林威治西部的夏令时地区的偏移秒数,如果该地区在格林威治东部会返回负值(如西欧,包括英国),对夏令时启用地区才能使用。

time.asctime([t])

接受时间元组并返回一个可读的形式"Tue May 30 17:17:30 2017"(2017年5月30日周二17时17分30秒)的24个字符的字符串。

time.clock()

用以浮点数计算的秒数返回当前的CPU时间,用来衡量不同程序的耗时,比time.time()更有用。
python3.3以后不被推荐使用,该方法依赖操作系统,建议使用per_counter(返回系统运行时间)或process_time(返回进程运行时间)代替。

time.ctime([secs])

作用相当于asctime(localtime(secs)),未给参数相当于asctime()

time.gmtime([secs])

接收时间辍(1970纪元年后经过的浮点秒数)并返回格林威治天文时间下的时间元组t(t.tm_isdst始终为0)

time.daylight

如果夏令时被定义,则该值为非零

time.localtime([secs])

接收时间辍(1970纪元年后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取为0或1,取决于当地当时是不是夏令时)

time.mktime(t)

接受时间元组并返回时间辍(1970纪元年后经过的浮点秒数)

time.perf_counter()

返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间.由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的

time.process_time()

返回当前进程执行CPU的时间总和,不包含睡眠时间.由于返回值的基准点是未定义的,所以只有连续调用的结果之间的差才是有效的

time.sleep(secs)

推迟调用线程的运行,secs的单位是秒

time.strftime(format[,t])

把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串.如果t未指定,将传入time.localtime(),如果元组中任命一个元素越界,将会抛出ValueError异常
format格式如下:

格式 描述
%a 本地(local)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01-31)
%H 一天中的第几个小时(24小时制,00-23)
%l 一天中的第几个小时(12小时制,01-12)
%j 一年中的第几天(01-366)
%m 月份(01-12)
%M 分钟数(00-59)
%p 本地am或者pm的相应符
%S 秒(01-61)
%U 一年中的星期数(00-53,星期天是一个星期的开始,第一个星期天之前的所有天数都放在第0周)
%w 一个星期中的第几天(0-6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始
%x 本地相应日期
%X 本地相应时间
%y 去掉世纪的年份(00-99)
%Y 完整的年份
%z 用+HHMM或者-HHMM表示距离格林威治的时区偏移(H代表十进制的小时数,M代表十进制的分钟数)
%Z 时区的名字(如果不存在为空字符)
%% %号本身
%p只有与%I配合使用才有效果
* 当使用strptime()函数时,只有当在这年中的周数和天数被确定的时候%U和%W才会被计算

time.strptime(string[,format])

把一个格式化时间字符串转化为struct_time,实际上它和strftie()是逆操作

time.time()

返回当前时间的时间戳(1970元年后的浮点秒数)

time.timezone()

是当地时区(未启动夏令时)距离格林威治的偏移秒数(美洲>0,欧洲大部分,亚洲,非洲<=0)

time.tzname

包含两个字符串的元组,第一是当地夏令时区的名称,第二是当地的DST时区的名称

下面是找到的例子:


import time

def parse_timestr(time_str, flag=True):
    """
    把时间字符串转换为时间戳格式
    :param time_str: 时间字符串,格式为:2019-01-01 12:12:12 或 2019-01-01
    :param flag: 标志位,决定输入时间字符串的格式
    :return: 时间戳格式
    """
    if flag:
        struct_time = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")  # 2019-01-01 12:12:12
    else:
        struct_time = time.strptime(time_str, "%Y-%m-%d")  # 2019-01-01
    return time.mktime(struct_time)


def parse_timestamp(time_stamp, flag=True):
    """
    把时间戳转换为时间字符串
    :param time_stamp: 时间戳
    :param flag: 标志位,可以指定输出时间字符串的格式
    :return: 时间字符串,格式为:2019-01-01 12:12:12 或 2019-01-01
    """
    localtime = time.localtime(time_stamp)
    if flag:
        time_str = time.strftime("%Y-%m-%d %H:%M:%S", localtime)
    else:
        time_str = time.strftime("%Y-%m-%d", localtime)
    return time_str


def day_range(interval_day):
    """
    获取指定天内的时间字符串的列表
    :return:
    """
    c_time = (int(time.time() / (24 * 3600)) + 1) * 24 * 3600
    day_range_str = c_time - 24 * 3600 * interval_day

    day_list = [parse_timestamp(t, flag=False) for t in range(day_range_str, c_time, 3600 * 24)]
    return day_list


def is_workday(time_str):
    """
    传入时间字符串,判断传入时间字符串是否是工作日
    :param time_str: 必须是时间字符串类型,比如:"2019-01-21 14:30:31"
    :return: True/False,是否为非工作日
    """
    tmp = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
    workday_list = ["Mon", "Tue", "Wed", "Thu", "Fri"]

    week = time.strftime("%a", tmp)
    if week in workday_list:
        return True
    else:
        return False


def is_holiday(time_str):
    """
    传入时间字符串,判断传入时间字符串是否是工作日
    :param time_str: 必须是时间字符串类型,比如:"2019-01-21 14:30:31"
    :return: True/False,是否为非工作日
    """
    tmp = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
    holiday_list = ["Sat", "Sun"]

    week = time.strftime("%a", tmp)
    if week in holiday_list:
        return True
    else:
        return False


def get_day_list(start_timestamp, end_timestamp, flag = True):
    """
    传入开始时间戳和结束时间戳,获取时间段内的日期列表
    :param start_timestamp: 开始时间戳
    :param end_timestamp: 结束时间戳
    :param flag: 标志位
    :return: 日期列表
    """
    tmp = range(int(start_timestamp), int(end_timestamp) + 3600, 3600 * 24)
    if flag:
        tmp_range = [{"day_str": parse_timestamp(i, flag=False)} for i in tmp]
    else:
        tmp_range = [parse_timestamp(i, flag=False) for i in tmp]
    return tmp_range


def covert_time(time_str):
    """
    把时间段转换为秒数
    :param time_str:
    :return:
    """
    if time_str.endswith("h"):
        stamp = float(time_str.strip("h")) * 3600
    elif time_str.endswith("m"):
        stamp = float(time_str.strip("m")) * 60
    else:
        stamp = float(time_str)
    return stamp

datetime库的使用

datetime模块常用的主要有下面这四个类:

  1. datetime.date : 是指年月日构成的日期(相当于日历)
  2. datetime.time : 是指时分秒微秒构成的一天24小时中的具体时间(相当于手表)
  3. datetime.datetime: 上面两个合在一起,既包含时间又包含日期
  4. datetime.timedelta: 时间间隔对象(timedelta)。一个时间点(datetime)加上一个时间间隔(timedelta)可以得到一个新的时间点(datetime)。比如今天的上午3点加上5个小时得到今天的上午8点。同理,两个时间点相减会得到一个时间间隔。

datetime.date 类

  1. 新建一个date对象,日期为今天,既可以直接调用datetime.date.today(),也可以直接向datetime.date()传值,如下:
>>>from datetime import *
>>>date.today()

  1. datetime.date.strftime(format) 格式化为需要的时间,如常用的 “年-月-日 小时:分钟:秒” 格式
>>> today.strftime('%Y-%m-%d %H:%M:%S')
>>> '2014-08-15 00:00:00’

date对象中小时、分钟、秒默认都是0,纪元年的那个时间

  1. datetime.date.timple() 转成struct_time格式,这样传递给time.mktime(t) 后,直接转成时间戳
>>>today.timetuple()
>>>time.struct_time(tm_year=2014, tm_mon=8, tm_mday=15, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=227, tm_isdst=-1)
>>>time.mktime(today.timetuple())
>>>1408032000.0
  1. datetime.date.replace(year, month, day) 返回一个替换后的date对象
>>> today.replace(year=2013)
>>> datetime.date(2013, 8, 15)
  1. datetime.date.fromtimestamp(timestamp) 将时间戳转化为date对象
>>>datetime.date.fromtimestamp(1408058729)
>>>datetime.date(2014, 8, 15)

datetime.time 类

  1. 新建一个time对象
>>> t
>>> datetime.time(8, 45, 20)
  1. datetime.time.(format)格式化输出
>>> t.strftime('%Y-%m-%d %H:%M:%S')
>>> '1900-01-01 08:45:20’

time对应的年、月、日为1900、01、01,纪元年的那个时间

  1. datetime.time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) 返回一个替换后的time对象
>>> t.replace(hour=9)
>>> datetime.time(9, 45, 20)

datetime.datetime类

个人觉得和date的那些方法差不多。

  1. 新建一个datetime对象,日期为今天,既可以直接调用datetime.datetime.today(),也可以直接向datetime.datetime()传值,如下:
>>> d1 = datetime.datetime.today()
>>> d1
>>>datetime.datetime(2014, 8, 15, 8, 12, 34, 790945)
>>>d2 = datetime.datetime(2014, 8, 15, 8, 12, 34, 790945)
>>> d2
>>>datetime.datetime(2014, 8, 15, 8, 12, 34, 790945)

2.datetime.datetime.now([tz]) 当不指定时区时,和datetime.datetime.today()是一样的结果,如下

In [25]: datetime.datetime.now()
Out[25]: datetime.datetime(2014, 8, 15, 8, 14, 50, 738672)

3..datetime.datetime.strftime(format) 格式化为需要的时间,如常用的 “年-月-日 小时:分钟:秒” 格式
In [27]: d1
Out[27]: datetime.datetime(2014, 8, 15, 8, 12, 34, 790945)
In [28]: d1.strftime('%Y-%m-%d %H:%M:%S')
Out[28]: '2014-08-15 08:12:34’

4.datetime.datetime.timple() 转成struct_time格式,这样传递给time.mktime(t) 后,直接转成时间戳格式

>>> d1
>>> datetime.datetime(2014, 8, 15, 8, 12, 34, 790945)
>>>d1.timetuple()
>>> time.struct_time(tm_year=2014, tm_mon=8, tm_mday=15, tm_hour=8, tm_min=12, tm_sec=34, tm_wday=4, tm_yday=227, tm_isdst=-1)
>>> time.mktime(d1.timetuple())
>>> 1408061554.0

5.datetime.datetime.replace(year, month, day) 返回一个替换后的date对象

>>>d1
>>> datetime.datetime(2014, 8, 15, 8, 12, 34, 790945)
>>> d1.replace(year=2000)
>>> datetime.datetime(2000, 8, 15, 8, 12, 34, 790945)
  1. datetime.datetime.fromtimestamp(timestamp) 将时间戳转化为datetime对象
>>> time.time()
>>> 1408061894.081552
>>> datetime.datetime.fromtimestamp(1408061894)
>>> datetime.datetime(2014, 8, 15, 8, 18, 14)

datetime.timedelta类

用法如下:

>>>today = datetime.datetime.today()
>>>yesterday = today - datetime.timedelta(days=1)
>>> yesterday
>>> datetime.datetime(2014, 8, 14, 15, 8, 25, 783471)
>>> today
>>> datetime.datetime(2014, 8, 15, 15, 8, 25, 783471)

calendar库的使用

calendar 模块可以以标准的模式打印出给定年月的日历。

  1. 使用calender 模块
>>>import calendar
>>>calendar.prmonth(1999, 12)
>>>
    December 1999
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 
  1. prmonth(year, month)打印给定月份的日历。
>>>import calendar
>>>calendar.prcal(2000)
>>>                                  2000

       January                  February                    March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6             1  2  3  4  5
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       6  7  8  9 10 11 12
10 11 12 13 14 15 16      14 15 16 17 18 19 20      13 14 15 16 17 18 19
17 18 19 20 21 22 23      21 22 23 24 25 26 27      20 21 22 23 24 25 26
24 25 26 27 28 29 30      28 29                     27 28 29 30 31
31

        April                      May                      June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2       1  2  3  4  5  6  7                1  2  3  4
 3  4  5  6  7  8  9       8  9 10 11 12 13 14       5  6  7  8  9 10 11
10 11 12 13 14 15 16      15 16 17 18 19 20 21      12 13 14 15 16 17 18
17 18 19 20 21 22 23      22 23 24 25 26 27 28      19 20 21 22 23 24 25
24 25 26 27 28 29 30      29 30 31                  26 27 28 29 30

        July                     August                   September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6                   1  2  3
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       4  5  6  7  8  9 10
10 11 12 13 14 15 16      14 15 16 17 18 19 20      11 12 13 14 15 16 17
17 18 19 20 21 22 23      21 22 23 24 25 26 27      18 19 20 21 22 23 24
24 25 26 27 28 29 30      28 29 30 31               25 26 27 28 29 30
31

       October                  November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                   1             1  2  3  4  5                   1  2  3
 2  3  4  5  6  7  8       6  7  8  9 10 11 12       4  5  6  7  8  9 10
 9 10 11 12 13 14 15      13 14 15 16 17 18 19      11 12 13 14 15 16 17
16 17 18 19 20 21 22      20 21 22 23 24 25 26      18 19 20 21 22 23 24
23 24 25 26 27 28 29      27 28 29 30               25 26 27 28 29 30 31
30 31

PS:值得注意的是日历打印的格式使用的是欧洲标准,也就是说,星期一放在一周的第一天。

下面提出其他日历模块的使用方法:

  1. calendar.calendar(year,w=2,l=1,c=6)
    返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。

  2. calendar.firstweekday( )
    返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。

  3. calendar.isleap(year)
    是闰年返回True,否则为false。

  4. calendar.leapdays(y1,y2)
    返回在Y1,Y2两年之间的闰年总数。

  5. calendar.month(year,month,w=2,l=1)
    返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。

  6. calendar.monthcalendar(year,month)
    返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。

  7. calendar.monthrange(year,month)
    返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。

  8. calendar.prcal(year,w=2,l=1,c=6)
    相当于 print calendar.calendar(year,w,l,c).

  9. calendar.prmonth(year,month,w=2,l=1)
    相当于 print calendar.calendar(year,w,l,c)。

  10. calendar.setfirstweekday(weekday)
    设置每周的起始日期码。0(星期一)到6(星期日)。

  11. calendar.timegm(tupletime)
    和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间辍(1970纪元后经过的浮点秒数)。

  12. calendar.weekday(year,month,day)
    返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

random库的使用

Python中的random模块用于生成随机数。

下面具体介绍random模块的功能:

  1. random.random()
    用于生成一个0到1的随机浮点数
>>>import random  
>>>a = random.random()
>>>print (a)  
>>>0.6257592229704143
  1. random.uniform(a,b)

用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。

>>>import random  
>>>print(random.uniform(1,10))  
>>>print(random.uniform(10,1)) 
>>>9.374055253824894
>>>6.793063400226754
  1. random.randint(a, b)

用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

>>>import random  
>>>print(random.randint(1,10)) 
  1. random.randrange([start], stop[, step])

从指定范围内,按指定基数递增的集合中 获取一个随机数。

  • random.randrange(10, 30, 2),结果相当于从[10, 12, 14, 16, … 26, 28]序列中获取一个随机数。
  • random.randrange(10, 30, 2)在结果上与 random.choice(range(10, 30, 2) 等效。
>>>import random  
>>>print(random.randrange(10,30,2)) 
>>>18
  1. random.choice(sequence)

random.choice从序列中获取一个随机元素。其函数原型为random.choice(sequence)。

参数sequence表示一个有序类型。
这里要说明一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。

>>>import random  
>>>lst = ['python','C','C++','javascript']  
>>>str1 = ('I love python')  
>>>print(random.choice(lst))
>>>print(random.choice(str1))  
>>>python
>>>n
  1. random.shuffle(x[, random])

用于将一个列表中的元素打乱,即将列表内的元素随机排列。

>>>import random
>>>p = ['A' , 'B', 'C', 'D', 'E' ]
>>>random.shuffle(p)  
>>>print (p)  
>>>['B', 'D', 'E', 'C', 'A']
  1. random.sample(sequence, k)

从指定序列中随机获取指定长度的片断并随机排列。

  • 注意:sample函数不会修改原有序列。
>>>import random   
>>>lst = [1,2,3,4,5]  
>>>print(random.sample(lst,4))  
>>>print(lst) 
>>>[5, 3, 4, 2]
[1, 2, 3, 4, 5]

猜你喜欢

转载自blog.csdn.net/syd_de_blog/article/details/89141264