时间处理非常常见,时间在各种数据分析中也是一种重要的分析依据。
下面围绕着几个常见问题来介绍:
1)获取当前时间
所谓当前时间,其实是指你运行代码的电脑上的时间。计算机系统每时每刻都在计时,可以通过专门的函数来获取这些当前时间信息。
方法1:使用datetime模块中的datetime类型
from datetime import datetime
print(datetime.now())
输出为:2022-02-22 17:49:26.474330
前面的内容很好理解,分别是年月日和小时分钟秒,小数点后面的六位小数可以看成是精度更细的秒数。
这里如何理解datetime类型呢?首先datetime类型在datetime模块中,因此导入语句不能随意省略。其次,datetime类型可以理解为一个变量,它里面提供了很多函数,比如now函数就是返回当前时间。这种类型不是我们前面课程中学习的标准基本类型(即整型、布尔型之类),而是一种扩展类型。随着学习的深入,我们不断了解这些更多的扩展类型,通常都具有特定的功能,也会在特定的模块中。
也可以只获取指定的时间内容,比如年份:
from datetime import datetime
print(datetime.now().year)
输出为:2022。其他时间内容以此类推,都有对应的属性。这里year不是一个函数,它只是一个值,一个变量,通常我们称为属性。因此无需在year后面加圆括号。
利用datetime类型,还可以根据要求自定义一个时间:
from datetime import datetime
print(datetime(2020, 10, 1, 9, 10, 20))
输出为:2020-10-01 09:10:20。
方法2:使用time模块中的函数
import time
print(time.asctime())
输出为:Fri Feb 26 08:36:33 2021,内容差不多,但是时间格式和前面的不一样。
除此以外,time模块还提供了更多的获取时间函数:
import time
print(time.ctime())
print(time.localtime())
print(time.gmtime())
输出为:
Fri Feb 26 08:54:47 2021
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=26, tm_hour=8, tm_min=54, tm_sec=47, tm_wday=4, tm_yday=57, tm_isdst=0)
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=26, tm_hour=0, tm_min=54, tm_sec=47, tm_wday=4, tm_yday=57, tm_isdst=0)
这里其实有三行输出,对应三个函数。ctime和asctime功能类似,都返回的是本地时间。localtime也是返回本地时间,但是采取了“时间元组”的表达方式。所谓时间元组,就是你看到的这个输出结果,通常各个时间属性(名称固定)及其数值构成一个整体。gmtime则返回格林威治的时间元组信息,比北京时间晚8个小时。
同样,time模块函数也可以获取指定的时间内容。比如获取年份:
import time
print(time.localtime().tm_year)
输出为:2022。注意,这里的tm_year也是一个属性。很多初学者有时会懵,建议大家先将常见的用法保存下来,做好记录,用时照葫芦画瓢,使用多了,渐渐的就记住了,无需刻意记忆(当然,除了考试)。
2)时间的转换
所谓时间的转换是指将这些获取的原始时间信息,使用新的时间格式来完成输出,比如转换为星期几等等:
为此,我们首先来理解下时间戳。时间戳是一个整数,利用与1970年1月1日0点之间总共的秒数来表达当前时间。如果是小数,则可以更为精确的表达毫秒微秒等时间。显然这个值越大,说明离1970年初那个时间点越远。很多计算机系统都是采取时间戳这种方式来表达原始时间信息。
我们可以获取当前时间的时间戳:
import time
print(time.time())
输出为:1645526672.3713439,这是2022年2月22日傍晚6点44分的一个时间戳。显然,这个信息对于几乎所有人都觉得无法直观理解,我们转换为标准格式时间:
import time
from datetime import datetime
print(datetime.fromtimestamp(time.time()))
输出为:2022-02-22 18:47:51.863326。这里使用了datetime模块的fromtimestamp函数实现了时间戳到标准格式时间的转换。反过来,它也提供了将指定时间转换为时间戳的方法:
from datetime import datetime
print(datetime(2020,10,1,9,10,20).timestamp())
输出为:1601514620.0。
时间转换不仅可以转换格式,还可以转换单位,比如将年月日转换为星期几、一年中的第几周或者是否为工作日等。
from datetime import datetime
today = datetime.now()
print(today.weekday())
print(today.isoweekday())
print(today.isocalendar())
输出为:
1
2
(2022, 8, 2)
其中,weekday和isoweekday都表示星期几, 前者从0开始表示星期一,后者则从1开始表示星期一。 isocalendar表示当前时间为当前年第几周的星期几,这里表示输出的当前时间是2022年第八周的星期二。
说到星期几,Python的calendar模块非常好用,直接可以返回指定年月的日历:
import calendar
print(calendar.month(2021, 2))
输出为:
February 2021
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
3)不同格式的时间转换
这里的时间转换主要是指时间和字符串之间的相互转换,通常可以实现更为灵活漂亮的输出内容,比如使用汉字年月日来组织时间格式输出等。主要使用了strftime和strptime两个函数。
我们先来看看strftime,它可以实现时间向特定格式的字符串格式输出:
from datetime import datetime
import time
today = datetime.now()
print(today.strftime('%Y/%m/%d %H:%M:%S'))
today = time.localtime()
print(time.strftime('%Y/%m/%d %H:%M:%S', today))
输出为:
2022/02/22 18:58:37
2022/02/22 18:58:37
strftime函数在datetime模块和time中都有,功能略有差异,但是主要功能一致,都可以通过格式占位符来自定义时间的输出格式。因此下面主要以datetime模块的strftime函数来说明:
比如使用中文年月日来输出时间:
from datetime import datetime
today = datetime.now()
print(today.strftime('%Y年%m月%d日%H小时%M分钟%S秒'))
输出为:2022年02月22日19小时01分钟38秒。这里不论是时间内容还是次序都可以自由选择和设定。
请注意,如果是Windows操作系统,该代码可能需要增加这里的地理区域设置,否则会出现运行错误。方法即通过locale来设置,如:
from datetime import datetime
import locale
locale.setlocale(locale.LC_CTYPE, 'chinese')
today = datetime.now()
print(today.strftime('%Y年%m月%d日%H小时%M分钟%S秒'))
此处初学者无需深究,加上第二行和第三行即可。
strptime函数正好反过来,可以把字符串转换为时间类型。其实strptime函数名称中的 p 就表示parse,解析转换的意思,而strftime函数名称中的 f 表示format,格式的意思。这样有助于记忆。
from datetime import datetime
print(datetime.strptime('2021/02/26 09:10:20', '%Y/%m/%d %H:%M:%S'))
输出为: 2021-02-26 09:10:20。看起来,好像没有变换,但是此时的这个结果是时间类型可以直接进行时间处理,比如获取是星期几:
from datetime import datetime
dt = datetime.strptime('2021/02/26 09:10:20', '%Y/%m/%d %H:%M:%S')
print(dt.weekday())
输出为:4,表示星期五。显然,如果要从原始的字符串“2021/02/26 09:10:20”来解析是星期几,显然太麻烦了,不如这样转换为时间类型,直接调用所需的函数或者属性得到结果。
配套学习资源、慕课视频: