<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【Python】8000字:Python時(shí)間系列之datetime模塊

          共 9477字,需瀏覽 19分鐘

           ·

          2021-10-26 00:06

          公眾號(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)參考:

          6大模塊拿下Python時(shí)間序列

          四、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è)常量:

          1. MAXYEAR:返回能表示的最大年份,datetime.MAXYEAR
          2. 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)掃碼:
          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉青草 | 一区二区三区韩国av夜夜骚 | 热99精品 | 久久精品电影 | 人人鲁人人看人人摸人人操 |