有趣的Python笔记Ⅰ_Time

有趣的Python笔记

[TOC]

关系

图片来自https://www.cnblogs.com/codefish/p/5032753.html‘[python基础]关于包,类,模块的那些事儿’

类(class)使一段代码更容易多次使用;完成某一操作所使用的多个类成为模块(model);完成某一类操作所使用的模块集合为包(package),各个模块(*.py)加上“__init__.py”得以成为包。

Time

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
32
33
34
35
36
37
38
39
40
>>> import time

# 时间戳
>>> time.time()
1548488203.4358122

# 参数形式(本地时间)
>>> time.localtime( [time.time()] )
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=26, tm_hour=15, tm_min=36, tm_sec=59, tm_wday=5, tm_yday=26, tm_isdst=0)

# 参数形式(格林威治时间)
>>> time.gtime( [time.time()] )
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=26, tm_hour=15, tm_min=36, tm_sec=59, tm_wday=5, tm_yday=26, tm_isdst=0)

# asc形式(星期 月 日 时:分:秒 年)
>>> time.asctime( [time.localtime()] [time.time()] )
'Sat Jan 26 15:40:30 2019'

# 固定格式(同asc形式)
>>> time.ctime( [time.time()] )

# strf形式(注意大小写!)
# struct_time to format_time
>>> time.strftime("%Y-%m-%d %H-%M-%S", time.localtime())
'2019-01-26 15-41-57'

# strf形式(与asc形式相同)
>>> time.strftime("%a %b %d %H:%M:%S %Y",time.localtime())
'Sat Jan 26 15:43:46 2019'

# strp形式
# format_time to struct_time
>>> time.strptime('2019-01-26 15:36:59', '%Y-%m-%d %X')
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=26, tm_hour=15, tm_min=36, tm_sec=59, tm_wday=5, tm_yday=26, tm_isdst=0)

# 格式化时间转换(时间戳)
# struct_time to timestamp
>>> time.mktime(time.strptime("Sat Jan 26 15:43:46 2019", "%a %b %d %H:%M:%S %Y"))
1548488626.0

无非三种格式:

时间戳(timestamp)、格式化时间(format_time)、固定格式时间(struct_time)

time模块

图片来自https://www.cnblogs.com/tkqasn/p/6001134.html ‘python time模块和datetime模块详解’


P.S. Unix时间戳(Unix epoch, Unix time, POSIX time 或 Unix timestamp)为从格林尼治时间1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

1、Y2038问题:时间戳数值溢出,大多数UNIX系统中UNIX时间戳为32位,进位后符号位置1,其余31位为0。“时间回归”为1901年12月13日20时45分52秒,系统错误。

2、64位iOS系统负时间值问题:时区转换(减去数个小时)造成时间小于1970年1月1日(UTC/GMT的午夜),时间错误,无法启动。

符号 意义
%Y 年份表示(000-9999)
%y 年份表示(00-99)
%m 月份(01-12)
%d 日期(0-31)
%I 12小时制小时数(01-12)
%H 24小时制小时数(0-23)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.
%U 一年中的星期数(00-53)星期天为开始
%w 星期(0-6),星期天为开始
%W 一年中的星期数(00-53)星期一为开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称

Datetime

datatime模块重新封装time模块,提供的类有:date, time, datetime, timedelta, tzinfo

datetime.datetime.now():model --> class --> method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> import datetime
>>> date.max # 所能显示的最大时间
datetime.date(9999, 12, 31)
>>> date.min # 所能显示的最小时间
datetime.date(1, 1, 1)
>>> date.today() # 返回的是表示本地日期的date对象
datetime.date(2019, 1, 30)

>>> import time
>>> date.fromtimestamp(time.time()) # 根据给定时间戳,返回date对象
datetime.date(2019, 1, 30)

>>> type(date.fromtimestamp(time.time())) # 返回值类型为'class'
<class 'datetime.date'>
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> dates = date.today() # 创建名为dates的date对象
>>> dates
datetime.date(2019, 1, 30)

# 返回年/月/日,替换年/月/日
>>> dates.day
30
>>> dates.month
1
>>> dates.year
2019
>>> dates.replace(2018,12,29)
datetime.date(2018, 12, 29)
1
2
3
4
5
6
7
8
9
10
11
12
>>> dates.timetuple() # 参数(元组)形式(time.localtime())
time.struct_time(tm_year=2019, tm_mon=1, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=30, tm_isdst=-1)
>>> dates.weekday() # 星期,星期一为0,依次递推
2
>>> dates.isoweekday() # 标准星期,星期一为1,依次递推
3
>>> dates.isocalendar() # 返回元组形式,表示第几年的第几周的第几天
(2019, 5, 3)
>>> dates.isoformat() # 返回字符串格式的日期
'2019-01-30'
>>> dates.strftime("%Y-%m-%d") # 和time.stftime()同
'2019-01-30'

附:粗略计算程序运行时间

  • 基本代码逻辑

    1
    2
    3
    4
    5
    6
    7
    8
    9
      #!usr/bin/env python3
    #-*- coding: utf-8 -*-
    __author__ = 'QCF'

    import time
    t1 = time.time()
    ................
    t2 = time.time()
    print("程序运行时间约为:{:.2f}ms".format((t2 - t1) * 1000))
  • 自定义运行次数,计算平均时间,输出到文件。

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #!/usr/bin/env python3
    #-*- encoding: utf-8 -*-
    __author__ = 'QCF'


    import time

    # 计入程序运行次数
    temp = input("Please input runing times:")

    # 判断输入数据是否为整数
    if (isinstance(eval(temp), int) == False):
    print("Error! 程序运行次数应为整数!\n请重新运行程序!")
    exit()
    else:
    pass

    temp = int(temp)
    TimeList = []
    for i in range(temp):
    t1 = 0
    t2 = 0
    t1 = time.time()

    # =============需要运行的程序=============
    import time
    a = time.time()
    b = time.time()
    print((b-a)*1000)
    # print("程序运行时间约为:{:.6f}ms".format((b - a) * 1000))
    # =============需要运行的程序=============

    t2 = time.time()
    DeltaTime = (t2 - t1) * 1000
    TimeList.append(DeltaTime)

    # 生成时间列表
    Sum = 0
    for time in TimeList:
    Sum += time

    # 打印目标程序
    print('=' * 40)
    print('目标程序为:')
    print("\nimport time\n"
    "a = time.time()\n"
    "b = time.time()\n"
    "print((b-a)*1000\n)")
    print('目标程序结束')
    print('=' * 40)

    # 打印平均时间数据
    print("各次运行时间为:{:}ms".format(TimeList))

    print("目标程序运行的次数为:{}".format(temp))
    print("目标程序运行的平均时间为:{}ms".format(Sum / temp))

    # 分行输入文件
    f = open("AverageRuningTime.txt", "w", encoding = 'utf-8')

    # ===============输入目标程序==============
    f.write("目标程序为:\n\n")
    f.write("import time\na = time.time()\nb = time.time()\nprint((b-a)*1000)\n\n")
    # ===============输入目标程序==============

    # 输入时间列表到文件
    f.write("各次运行时间为(ms):\n")
    for i in TimeList:
    f.write(str(i))
    f.write('\n')
    # 输入平均时间数据到文件
    f.write('\n\n')
    f.write("目标程序运行的次数为:")
    f.write(str(temp))
    f.write('\n\n')
    f.write("目标程序运行的平均时间为(ms):")
    f.write(str(Sum / temp))
    f.close()

Timeit :准确测量代码的执行时间

pprint模块

iPython:

  • %开头的叫做line magic, 这种类型的指令只能作用于一行代码,默认是可以不带百分号使用。
  • %%开头的叫做cell magic, 这种类型的指令只能作用于代码块