5.2 时间处理

时间处理非常常见,时间在各种数据分析中也是一种重要的分析依据。

5.2 时间处理_第1张图片

下面围绕着几个常见问题来介绍:

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)时间的转换

所谓时间的转换是指将这些获取的原始时间信息,使用新的时间格式来完成输出,比如转换为星期几等等:

5.2 时间处理_第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”来解析是星期几,显然太麻烦了,不如这样转换为时间类型,直接调用所需的函数或者属性得到结果。

配套学习资源、慕课视频:

Python大数据分析-李树青icon-default.png?t=M1L8https://www.njcie.com/python/

你可能感兴趣的:(Python语言入门,时间,datetime,转换,strptime,strftime)