Python | 乘上 Time Machine

本篇文章主要介绍在使用 Python 过程中涉及到“时间”的一些处理笔记,包括获取格式化后的当前时间、实时观察任务完成的进度等等。

Photo by Jason Wong on Unsplash

Photo by Jason Wong on Unsplash

一、获取当前系统时间

第一种:导入 datetime 模块

1
2
3
import datetime
>>> datetime.datetime.now()
datetime.datetime(2017, 7, 5, 13, 40, 18, 759000)

当然这种获取办法得到的时间格式往往不符合我们的阅读习惯,可以通过strftime()函数来格式化当前时间,Python 中时间日期格式化符号有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%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 当前时区的名称
%% %号本身

比如,格式化当前时间为年-月-日

1
2
>>> datetime.now().strftime("%Y %B %d")
'2017 July 28'

如果想比较完整的本地日期和时间表示

1
2
>>> datetime.now().strftime("%c")
'Fri Jul 28 18:59:02 2017'

第二种:导入 time 模块

time当前时间的 Unix 时间戳(注:Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数)

1
2
3
4
5
6
import time
>>> time.time()
1501238427.6173134
# 将时间戳精确到秒
>>> int(time.time())
1501238482

你也可以将 Unix 时间戳格式化为易读的格式

1
2
3
import time
>>> time.strftime("%Y:%m:%d %H:%M:%S")
'2017:07:05 13:40:04'

获得当前时间前后某一时刻,比如在执行实时任务中,有时需要规定在每秒时间间隔内抓取一次数据,可以通过timedelta来实现。下面的例子中,end_timebegin_time是要大一秒的

1
2
3
4
5
begin_time = datetime.datetime.now()
end_time = begin_time + datetime.timedelta(seconds=1)
# 格式化当前时间
begin_time = begin_time.strftime("%Y-%m-%d %H:%M:%S")
end_time = end_time.strftime("%Y-%m-%d %H:%M:%S")

二、延迟进程调用

time模块有一个推迟调用线程time.sleep()的功能特别实用,括号内的数字表示进程挂起的时间(秒),比如

1
2
3
4
5
6
7
#!/usr/bin/python
import time
print "Start : %s" % time.ctime()
time.sleep(5)
print "End : %s" % time.ctime()
Start : Wed Jul 05 14:02:11 2017
End : Wed Jul 05 14:02:16 2017

三、计算程序运行时间

1
2
3
4
5
6
7
8
#!/usr/bin/python
#coding: utf-8
import time
start = time.clock()
# 中间是你的程序
elapsed = (time.clock() - start)
print("Time used:",elapsed)

四、显示任务完成进度

有的时候运行程序执行循环计算会等待较长的时间,这时如果有一个实时的可视化进度条那就再好不过了。在这里要介绍 Python 中两个非常有趣的库,分别是 tqdm 和 pyprind,它们可以帮助我们了解任务完成的状态。

tqdm

1
2
3
from tqdm import tqdm
for i tqdm(range(10)):
sleep(i)

pyprind

然后是 pyprind,相比 tqdmpyprind 允许自定义的空间就大了很多,进度可以有进度条百分比两种形式,程序运行完成还可以得到 CPU 和内存使用情况报告等等。

1
2
3
4
5
>>> for i in pyprind.prog_bar(range(10)):
time.sleep(1)
...
`ETA`表示距离程序结束的时间
0% [######## ] 100% | ETA: 00:00:02
1
2
3
4
>>> for i in pyprind.prog_percent(range(10)):
time.sleep(1)
···
[ 50 %] Time elapsed: 00:00:05 | ETA: 00:00:05
1
2
3
4
5
6
7
bar = pyprind.ProgBar(10, monitor=True, title='Test')
for i in range(10):
time.sleep(10) # your computation here
bar.update()
# print report for future reference
print(bar)

等待程序运行完了之后,pyprind 会打印出程序开始、结束时间以及 CPU 和内存占用的情况,一目了然。

1
2
3
4
5
6
7
8
9
Test
0% [##########] 100% | ETA: 00:00:00
Total time elapsed: 00:01:40
Title: Job_1
Started: 07/28/2017 19:59:49
Finished: 07/28/2017 20:01:29
Total time elapsed: 00:01:40
CPU %: 0.00
Memory %: 0.33

关于 pyprind 还有很多好玩的玩法,有兴趣的读者可以参考这个链接

推荐阅读

  1. Python datetime
  2. PyPrind demo
觉得还不错?帮我赞助点域名费吧:)