【Python】8000字:Python時(shí)間系列之datetime模塊
公眾號(hào):尤而小屋
作者:Peter
編輯:Peter
大家好,我是Peter~
在上篇Python或Pandas時(shí)間序列的文章中Peter詳細(xì)介紹了time模塊,本文中重點(diǎn)介紹的是datetime模塊。
這個(gè)模塊可以說(shuō)是time模塊的升級(jí)版本,使用的情況更為普遍和常見(jiàn),用法也更全面。文章中會(huì)通過(guò)各種例子來(lái)講解這個(gè)模塊的使用。

一、閑聊
最近一位律師通過(guò)公眾號(hào)加了Peter,他工作之余學(xué)習(xí)下Python,這個(gè)社會(huì)真的這么卷了嗎?
朋友們,Python學(xué)起來(lái),最好是跟著尤而小屋學(xué)起來(lái)~

二、目錄
本文的目錄參考:

三、Pandas文章
Pandas相關(guān)的文章更新到第26篇,近期的重點(diǎn)是:Python或Pandas中如何處理時(shí)間序列相關(guān)的數(shù)據(jù)。
上一篇文章是:time模塊的講解,請(qǐng)參考:

四、datetime模塊
4.1主要類
datetime模塊中包含的主要類為:
date:日期對(duì)象,常用的屬性有year, month, day等 time:時(shí)間對(duì)象,主要的屬性有hour, minute, second, microsecond datetime:日期時(shí)間對(duì)象,屬性date和屬性datetime的組合 datetime_CAPI:日期對(duì)象的C語(yǔ)言接口 timedelta:兩個(gè)時(shí)間之間的時(shí)間間隔 tzinfo:時(shí)區(qū)信息對(duì)象的抽象基類
4.2常量
主要是有兩個(gè)常量:
MAXYEAR:返回能表示的最大年份,datetime.MAXYEAR MINYEAR:返回能表示最小的年份,datetime.MINYEAR
五、5大類
下面介紹的datetime模塊中5大類的具體使用方法:
date time datetime timedelta tzinfo
在我們使用之前必須先把模塊導(dǎo)進(jìn)來(lái)
from?datetime?import?*???#?*表示模塊下面的所有類
5.1date類
date對(duì)象由year年份、month月份及day日期三個(gè)部分來(lái)構(gòu)成的:
1、當(dāng)前時(shí)間
#?方式1
from?datetime?import?date
datetime.today().date()
datetime.date(2021, 10, 20)
#?方式2
from?datetime?import?date
#?today是一個(gè)日期對(duì)象,返回的是當(dāng)前日期
today?=?date.today()
today??
datetime.date(2021, 10, 20)
通過(guò)year、month、day 3個(gè)屬性描述符來(lái)訪問(wèn):
print("今年:",today.year)???#?返回today對(duì)象的年份
print("本月:",today.month)??#?返回today對(duì)象的月份
print("今日:",today.day)???#?返回today對(duì)象的日
今年:2021
本月:10
今日:20
通過(guò)__getattribute__(...)方法獲得上述值:
today.__getattribute__("year")
2021
today.__getattribute__("month")
10
today.__getattribute__("day")
20
此外,我們還可以訪問(wèn)其他的date類的信息:
print("當(dāng)前日期:",today)??#?當(dāng)前日期
print("當(dāng)前日期(字符串形式):",today.ctime())???#?返回日期的字符串
print("時(shí)間(元組形式):",today.timetuple())???#?當(dāng)前日期的時(shí)間元組信息
當(dāng)前日期:2021-10-20
當(dāng)前日期(字符串形式):Wed Oct 20 00:00:00 2021
時(shí)間(元組形式):time.struct_time(tm_year=2021, tm_mon=10,tm_mday=20, tm_hour=0,tm_min=0, tm_sec=0,tm_wday=2, tm_yday=293, tm_isdst=-1)
print("本星期:",today.weekday())??#?0代表星期一,類推
print("公歷序數(shù):",today.toordinal())??#?返回公歷日期的序數(shù)
print("年/周數(shù)/星期:",today.isocalendar())???#?返回一個(gè)元組:一年中的第幾周,星期幾
本星期:2
公歷序數(shù):738083
年/周數(shù)/星期:(2021, 42, 3)
2、自定義時(shí)間
指定一個(gè)任意的時(shí)間:
#?自定義一個(gè)時(shí)間
new_date?=?date(2021,12,8)??
new_date
datetime.date(2021, 12, 8)
#?返回不同的屬性
print("year:?",?new_date.year)
print("month:?",?new_date.month)
print("day:?",?new_date.day)
year: 2021
month: 12
day: 8
#?返回時(shí)間元組
new_date.timetuple()
time.struct_time(tm_year=2021, tm_mon=12,tm_mday=8, tm_hour=0,tm_min=0, tm_sec=0,tm_wday=2, tm_yday=342,tm_isdst=-1)
#?返回公歷序數(shù)
new_date.toordinal()
738132
#?返回星期,0代表星期1,1代表星期2
new_date.weekday()
2
#?返回星期,1代表星期1,2代表星期2
new_date.isoweekday()
3
#?返回元組:(年份,第幾周,周幾)
new_date.isocalendar()
(2021, 49, 3)
#?以ISO?8601格式‘YYYY-MM-DD’返回date的字符串形式
new_date.isoformat()
'2021-12-08'
#?返回日期的字符串
new_date.ctime()
'Wed Dec 8 00:00:00 2021'
指定不同的日期輸出格式:
#?返回指定格式的日期字符串
new_date.strftime("%Y-%m-%d")
'2021-12-08'
new_date.strftime("%Y/%m/%d")
'2021/12/08'
new_date.strftime("%Y年%m月%d日")
'2021年12月08日'
#?替換時(shí)間,比如我們替換new_date
r_date?=?new_date.replace(2021,11,10)
r_date
datetime.date(2021, 11, 10)
在這種情況下,我們就生成了一個(gè)新的date對(duì)象,當(dāng)然我們還可以顯示的指定參數(shù):
new_date.replace(year=2021,month=11,day=11)
datetime.date(2021, 11, 11)
3、公歷序數(shù)相關(guān)
公歷序數(shù)是和toordinal方法相關(guān)的
#?查看當(dāng)前日期的公歷序數(shù)
to_timestamp?=?today.toordinal()
to_timestamp
738083
將給定的公歷序數(shù)轉(zhuǎn)成具體的時(shí)間日期:fromordinal
print(date.fromordinal(to_timestamp))
2021-10-20
4、時(shí)間戳轉(zhuǎn)化
通過(guò)函數(shù)fromtimestamp進(jìn)行轉(zhuǎn)化
import?time
t?=?time.time()??#?當(dāng)前時(shí)間的時(shí)間戳
t
1634732660.382036
print(date.fromtimestamp(t))??#?時(shí)間戳--->日期
2021-10-20
轉(zhuǎn)化任意的時(shí)間戳:
date.fromtimestamp(1698382719)
datetime.date(2023, 10, 27)
5、時(shí)間格式化
#?下面我們對(duì)today對(duì)象進(jìn)行格式化輸出
today
datetime.date(2021, 10, 20)
print(today.strftime("%Y/%m/%d"))
2021/10/20
print(today.strftime("%Y-%m-%d"))
2021-10-20
5.2time類
1、創(chuàng)建對(duì)象
先創(chuàng)建一個(gè)任意的時(shí)間
from?datetime?import?time
t?=?time(20,30,40,1000)
2、訪問(wèn)常見(jiàn)屬性
時(shí)分秒都是常見(jiàn)的屬性
print(t.hour)??#?時(shí)
print(t.minute)?#?分
print(t.second)??#?秒
print(t.microsecond)??#?微秒
20
30
40
1000
3、格式化輸出
#?返回?ISO?8601格式的時(shí)間字符串
t.isoformat()
'20:30:40.001000'
#?指定輸出的格式
t.strftime("%H:%M:%S:%f")
'20:30:40:001000'
同樣的,也具有替換功能:
#?隱式替換
t.replace(14,37,8)
datetime.time(14, 37, 8, 1000)
#?顯式替換
t.replace(hour=4,minute=18,second=19)
datetime.time(4, 18, 19, 1000)
5.3datetime類
datetime對(duì)象包含date對(duì)象和time對(duì)象的所有信息。專屬于datetime的方法和屬性匯總:
date(…):返回datetime對(duì)象的日期部分
time(…):返回datetime對(duì)象的時(shí)間部分
utctimetuple(…):返回UTC時(shí)間元組部分等
1、生成當(dāng)前日期
from?datetime?import?datetime?
k?=?datetime.today()??#?當(dāng)前具體時(shí)間
print(k)
2021-10-20 20:24:23.053493
訪問(wèn)當(dāng)前時(shí)間的不同屬性信息:
print("year:",k.year)
print("month:",k.month)
print("day:",k.day)
year: 2021
month: 10
day: 20
2、生成當(dāng)前時(shí)間
#?返回當(dāng)前的具體時(shí)間
n?=?datetime.now()
n
datetime.datetime(2021, 10, 20, 20, 24, 23, 694127)
#?返回datetime對(duì)象的日期部分
n.date()
datetime.date(2021, 10, 20)
#?返回datetime對(duì)象的時(shí)間部分
n.time()
datetime.time(20, 24, 23, 694127)
#?返回datetime對(duì)象的UTC時(shí)間元組部分
n.utctimetuple()
time.struct_time(tm_year=2021, tm_mon=10,tm_mday=20, tm_hour=20, tm_min=24,tm_sec=23, tm_wday=2,tm_yday=293, tm_isdst=0)
還可以生成其他的屬性信息:
#?返回當(dāng)前UTC日期和時(shí)間的datetime對(duì)象
print(datetime.utcnow())
2021-10-20 12:24:24.241577
#?給定時(shí)間戳的datetime對(duì)象
print(datetime.fromtimestamp(1697302830))??
2023-10-15 01:00:30
#?指定公歷序數(shù)的datetime對(duì)象
print(datetime.fromordinal(738000)?)
2021-07-29 00:00:00
#?拼接日期和時(shí)間
print(datetime.combine(date(2020,12,25),?time(11,22,54)))??
2020-12-25 11:22:54
3、指定任意時(shí)間
#?指定一個(gè)任意時(shí)間
d?=?datetime(2021,9,25,11,24,23)
print(d.date())??#?日期
print(d.time())??#?時(shí)間
print(d.timetz())??#?從datetime中拆分出具體時(shí)區(qū)屬性的time
print(d.timetuple())??#?時(shí)間元組
print(d.toordinal())??#?和date.toordinal一樣
print(d.weekday())??#?兩種星期表示同上
print(d.isoweekday())
print(d.isocalendar())??#?ISO格式化輸出
print(d.isoformat())
print(d.strftime("%Y-%m-%d?%H:%M:%S"))??#?指定格式
print(d.replace(year=2021,month=1))??#?替換
2021-09-25
11:24:23
11:24:23
time.struct_time(tm_year=2021, tm_mon=9,tm_mday=25, tm_hour=11, tm_min=24,tm_sec=23, tm_wday=5, tm_yday=268, tm_isdst=-1)
738058
5
6
(2021, 38, 6)
2021-09-25T11:24:23
2021-09-25 11:24:23
2021-01-25 11:24:23
4、格式化輸出
#?直接對(duì)時(shí)間的格式化輸出
print(datetime.strptime("2020-12-25","%Y-%m-%d"))
2020-12-25 00:00:00
對(duì)給定的datetime對(duì)象的格式化輸出,比如上面創(chuàng)建的實(shí)例化對(duì)象k:
k
datetime.datetime(2021, 10, 20, 20, 24, 23, 53493)
#?格式化輸出
k.strftime("%Y-%m-%d?%H:%M:%S")
'2021-10-20 20:24:23'
5.4timedelta類
timedelta對(duì)象表示一個(gè)時(shí)間段,即兩個(gè)日期 (date) 或日期時(shí)間 (datetime) 之間的差值。
目前支持參數(shù):weeks、days、hours、minutes、seconds、milliseconds、microseconds。
1、當(dāng)前日期
from?datetime?import?timedelta,?date,?datetime
d?=?date.today()??#?當(dāng)前日期
d
datetime.date(2021, 10, 20)
print("今天:",d)
print("加上5天:",d?+?timedelta(days=5))??#?加上5天
print("加上3天+8小時(shí):",?d?+?timedelta(days=3,hours=8))??#?加上3天和8個(gè)小時(shí)
今天:2021-10-20
加上5天:2021-10-25
加上3天+8小時(shí):2021-10-23
2、當(dāng)前時(shí)間
#?當(dāng)前時(shí)間點(diǎn)
now?=?datetime.now()??
now
datetime.datetime(2021, 10, 20, 20, 24, 26, 777335)
print(now?+?timedelta(hours=4))??#?加上4個(gè)小時(shí)
print(now?+?timedelta(weeks=2))??#?加上2個(gè)禮拜
print(now?-?timedelta(seconds=500))??#?減去500秒
2021-10-21 00:24:26.777335
2021-11-03 20:24:26.777335
2021-10-20 20:16:06.777335
3、datetime對(duì)象差值
delta?=?datetime(2020,12,26)?-?datetime(2020,12,12,20,12)
print(delta)
13 days, 3:48:00
delta.days??#?日期間隔:天
13
delta.seconds??#?日期間隔:秒
13680
delta.total_seconds()??#?#?全部轉(zhuǎn)成秒
1136880.0
4、兩個(gè)日期差值
d1?=?datetime(2021,10,1)
d2?=?datetime(2021,10,8)
d1.__sub__(d2)??#?d1?-?d2
datetime.timedelta(days=-7)
d2.__sub__(d1)?#?d2?-?d1
datetime.timedelta(days=7)
#?rsub表示用d2?-?d1
d1.__rsub__(d2)???
datetime.timedelta(days=7)
上面兩個(gè)日期的差值結(jié)果是datetime.timedelta, 如果獲得整數(shù)類型的結(jié)果則按下面的方法操作:
d1.__sub__(d2).days
-7
5.5tzinfo類
主要作用是指定時(shí)間所在的時(shí)區(qū)
1、指定時(shí)區(qū)
from?datetime?import?date,?timedelta,?datetime,?timezone
tz_utc_8?=?timezone(timedelta(hours=8))?#?創(chuàng)建時(shí)區(qū)
print(tz_utc_8)
UTC+08:00
now?=?datetime.now()
print(now)
2021-10-20 20:24:28.844732
new_time?=?now.replace(tzinfo=tz_utc_8)??#?強(qiáng)制加上8個(gè)小時(shí)
print(new_time)
2021-10-20 20:24:28.844732+08:00
2、時(shí)區(qū)切換
#?獲取UTC時(shí)間
utc_now?=?datetime.utcnow().replace(tzinfo=timezone.utc)??#?指定utc時(shí)區(qū)
print(utc_now)
2021-10-20 12:24:29.336367+00:00
#?通過(guò)astimezone切換到東八區(qū)
beijing?=?utc_now.astimezone(timezone(timedelta(hours=8)))
print(beijing)
2021-10-20 20:24:29.336367+08:00
# UTC時(shí)區(qū)切換到東九區(qū):東京時(shí)間
tokyo?=?utc_now.astimezone(timezone(timedelta(hours=9)))
print(tokyo)
2021-10-20 21:24:29.336367+09:00
#?北京時(shí)間(東八區(qū))直接切換到東京時(shí)間(東九區(qū))
tokyo_new?=?beijing.astimezone(timezone(timedelta(hours=9)))
print(tokyo_new)
2021-10-20 21:24:29.336367+09:00
六、常見(jiàn)應(yīng)用
6.1時(shí)間戳轉(zhuǎn)成日期
import?time
now_timestamp?=?time.time()
now_timestamp
1634732670.286224
#?1-轉(zhuǎn)成具體時(shí)間點(diǎn)
now?=?time.ctime(now_timestamp)??
print(now)
Wed Oct 20 20:24:30 2021
#?2-時(shí)間戳先轉(zhuǎn)成時(shí)間元組,strftime在轉(zhuǎn)成指定格式
now_tuple?=?time.localtime(now_timestamp)
print(now_tuple)
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=20, tm_hour=20, tm_min=24, tm_sec=30, tm_wday=2, tm_yday=293, tm_isdst=0)
time.strftime("%Y/%m/%d?%H:%M:%S",?now_tuple)
'2021/10/20 20:24:30'
#?選擇一個(gè)具體的時(shí)間戳
timestamp?=?1618852721
a?=?time.localtime(timestamp)??#?獲得時(shí)間元組形式數(shù)據(jù)
print("時(shí)間元組數(shù)據(jù):",a)
time.strftime("%Y/%m/%d?%H:%M:%S",?a)??#?格式化
時(shí)間元組數(shù)據(jù):time.struct_time(tm_year=2021, tm_mon=4,tm_mday=20, tm_hour=1, tm_min=18, tm_sec=41,tm_wday=1, tm_yday=110, tm_isdst=0)
'2021/04/20 01:18:41'
time.ctime(1618852741)
'Tue Apr 20 01:19:01 2021'
6.2日期時(shí)間轉(zhuǎn)成時(shí)間戳
給定一個(gè)字符串類型的日期數(shù)據(jù),如何轉(zhuǎn)化成我們想要的時(shí)間格式呢?
date?=?"2021-10-26?11:45:34"
#?1、時(shí)間字符串轉(zhuǎn)成時(shí)間數(shù)組形式
date_array?=?time.strptime(date,?"%Y-%m-%d?%H:%M:%S")
date_array
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=26, tm_hour=11, tm_min=45, tm_sec=34, tm_wday=1, tm_yday=299, tm_isdst=-1)
#?2、查看時(shí)間數(shù)組數(shù)據(jù)
print("時(shí)間數(shù)組:",?date_array)
時(shí)間數(shù)組:time.struct_time(tm_year=2021, tm_mon=10, tm_mday=26, tm_hour=11, tm_min=45, tm_sec=34, tm_wday=1, tm_yday=299, tm_isdst=-1)
#?3、mktime時(shí)間數(shù)組轉(zhuǎn)成時(shí)間戳
time.mktime(date_array)
1635219934.0
6.3日期格式化
import?time
old?=?"2021-09-12?12:28:45"
#?1、轉(zhuǎn)換成時(shí)間數(shù)組
time_array?=?time.strptime(old,?"%Y-%m-%d?%H:%M:%S")
#?2、轉(zhuǎn)換成新的時(shí)間格式(2021/09/12?12-28-45)
new?=?time.strftime("%Y/%m/%d?%H-%M-%S",time_array)??#?指定顯示格式
print("原格式時(shí)間:",old)
print("新格式時(shí)間:",new)
原格式時(shí)間:2021-09-12 12:28:45
新格式時(shí)間:2021/09/12 12-28-45往期精彩回顧 本站qq群554839127,加入微信群請(qǐng)掃碼:
