Python 日期的轉(zhuǎn)換及計(jì)算的具體使用詳解
日期的轉(zhuǎn)換及計(jì)算
對(duì)于日期,有時(shí)需執(zhí)行不同時(shí)間單位的轉(zhuǎn)換,或者接受字符串格式的日期,轉(zhuǎn)換為 datetime 對(duì)象。有時(shí)需計(jì)算日期的范圍,以及特定某個(gè)星期幾的日期。這里更多用到的是 Python 提供的 datetime 模塊。
datetime 模塊
日期與時(shí)間的簡(jiǎn)單轉(zhuǎn)換
datetime 模塊中可以通過創(chuàng)建 timedelta 對(duì)象表示一個(gè)時(shí)間段。如下示例:
>>> from datetime import timedelta >>> a = timedelta(days=2, hours=6) >>> b = timedelta(hours=4.5) >>> c = a + b >>> c datetime.timedelta(2, 37800) >>> c.days 2 >>> c.seconds 37800 >>> c.seconds / 3600 10.5 >>> c.total_seconds() / 3600 58.5
如果想表示指定的日期和時(shí)間,需要先創(chuàng)建 datetime 對(duì)象然后使用標(biāo)準(zhǔn)數(shù)學(xué)運(yùn)算執(zhí)行操作。示例如下:
>>> from datetime import datetime >>> a = datetime(2020, 1, 15) >>> print(a + timedelta(days=10)) 2020-01-25 00:00:00 >>> b = datetime(2020, 2, 3) >>> d = b - a >>> d datetime.timedelta(19) >>> d.days 19 >>> now = datetime.today() >>> print(now) 2020-01-15 10:59:10.230995 >>> print(now + timedelta(minutes=10)) 2020-01-15 11:09:10.230995
datetime 對(duì)象能夠自行處理閏年的問題,如下示例:
>>> a = datetime(2020, 3, 1) >>> b = datetime(2020, 2, 28) >>> a - b datetime.timedelta(2) >>> (a - b).days 2 >>> c = datetime(2019, 3, 1) >>> d = datetime(2019, 2, 28) >>> c - d datetime.timedelta(1) >>> (c - d).days 1
字符串與日期的轉(zhuǎn)換
當(dāng)編寫的程序接受以字符串格式表達(dá)的日期輸入時(shí),需求為將此類字符串轉(zhuǎn)換為 datetime 對(duì)象進(jìn)行計(jì)算。
使用 datetime 對(duì)象中的 strptime() 方法實(shí)現(xiàn),如下代碼:
>>> from datetime import datetime >>> text = '2020-01-15' >>> y = datetime.strptime(text, '%Y-%m-%d') >>> y datetime.datetime(2020, 1, 15, 0, 0) >>> z = datetime.now() >>> z datetime.datetime(2020, 1, 15, 11, 10, 11, 71792) >>> diff = z-y >>> diff datetime.timedelta(0, 40211, 71792)
上述 %Y 的含義是以十進(jìn)制表示的帶世紀(jì)的年份,%m 為以補(bǔ)零后的十進(jìn)制表示的月份,%d 為以補(bǔ)零后的十進(jìn)制表示月份中的一天。
以下是幾項(xiàng)格式代碼。例如:
| 指令 | 含義 |
|---|---|
| %a | 當(dāng)?shù)毓ぷ魅盏目s寫 |
| % A | 當(dāng)?shù)毓ぷ魅盏娜?/td> |
| % b | 當(dāng)?shù)卦路莸目s寫 |
| % B | 當(dāng)?shù)卦路莸娜?/td> |
| % H | 補(bǔ)零后十進(jìn)制表示的小時(shí)(24小時(shí)制) |
| % I | 補(bǔ)零后十進(jìn)制表示的小時(shí)(12小時(shí)制) |
| % M | 補(bǔ)零后十進(jìn)制表示的分鐘 |
| % S | 補(bǔ)零后十進(jìn)制表示的秒 |
將日期格式化為英文易讀形式,如下:
>>> z datetime.datetime(2020, 1, 15, 11, 10, 11, 71792) >>> format_z = datetime.strftime(z, "%A %B %d, %Y") >>> format_z 'Wednesday January 15, 2020'
datetime.strftime() 函數(shù)返回一個(gè)由顯示格式字符串所指定的代表日期的字符串。格式指令,如上述代碼中的 "%A %B %d, %Y"。其中該函數(shù)的第一個(gè)參數(shù)為 datetime 對(duì)象。
這里需要注意的地方是,strptime 的性能比較差。若明確需求是解析大量并且已經(jīng)知道格式的日期字符串,可以考慮自己實(shí)現(xiàn)一套解析方案。假設(shè)格式如 YYYY-MM-DD,可用如下代碼實(shí)現(xiàn)解析函數(shù):
from datetime import datetime
def parse_ymd(s):
year_s, mon_s, day_s = s.split('-')
return datetime(int(year_s), int(mon_s), int(day_s))
兩者實(shí)現(xiàn)的效果:
In [1]: from datetime import datetime
...: def parse_ymd(s):
...: year_s, mon_s, day_s = s.split('-')
...: return datetime(int(year_s), int(mon_s), int(day_s))
In [2]: text = "2020-01-15"
In [3]: %timeit datetime.strptime(text, '%Y-%m-%d')
7.75 µs ± 31 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [4]: %timeit parse_ymd(text)
1.05 µs ± 3.07 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
可以看出,parse_ymd() 函數(shù)比 datetime.strptime() 快 7 倍多。若是進(jìn)行大量處理的設(shè)計(jì)日期,且格式固定的情況下,可以考慮這個(gè)方案。
計(jì)算某個(gè)月份的日期范圍
Python 提供的 calendar 模塊提供了與日歷相關(guān)的函數(shù)。可以考慮配合 datetime 模塊實(shí)現(xiàn)需求:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@File: datetime_calendar.py
@Time: 2020/01/15 12:46:58
@Author: 大夢(mèng)三千秋
@Contact: yiluolion@126.com
'''
# put the import lib here
from datetime import date, timedelta
import calendar
def get_month_range(start_date=None):
'''獲取月份的范圍
Args:
start_date: 開始的日期,默認(rèn)為 None
Returns:
返回包含月份開始日期和結(jié)束日期的元組
'''
if start_date is None: # 若 start_date 為空,賦值為當(dāng)月的第一天
start_date = date.today().replace(day=1)
# 獲取月份的天數(shù)
_, days_in_month = calendar.monthrange(start_date.year, start_date.month)
# 計(jì)算結(jié)束日期
end_date = start_date + timedelta(days=days_in_month)
# 返回開始日期和結(jié)束日期的元組
return (start_date, end_date)
在交互式解釋器中使用如下:
In [1]: from datetime import timedelta In [2]: from datetime_calendar import get_month_range In [3]: a_day = timedelta(days=1) In [4]: first_day, last_day = get_month_range() In [5]: while first_day < last_day: ...: print(first_day) ...: first_day += a_day ...: 2020-01-01 2020-01-02 2020-01-03 2020-01-04 2020-01-05 2020-01-06 2020-01-07 2020-01-08 ...
注意:若在交互解釋器下無法導(dǎo)入自己寫的模塊中的方法,嘗試直接在文件所在的路徑下打開交互解釋器。
上面的代碼中,首先將 start_date 對(duì)應(yīng)月份的第一天的日期計(jì)算出來。這里使用了 date 對(duì)象的 replace() 方法將 day 屬性設(shè)置為 1,即表示第一天。
calendar.monthrange() 函數(shù)返回指定年份指定月份第一天是星期幾,以及這個(gè)月的天數(shù)。
獲得月份天數(shù)后,加上開始日期可得結(jié)束日期。這里需要注意的是,結(jié)束日期并不包含在這個(gè)日期范圍。在遍歷的時(shí)候,判斷條件為 first_day < last_day,不輸出 last_day 的值,以 timedelta 實(shí)例進(jìn)行遞增日期。
參考資料
來源
- David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013.
- "8.1. datetime — Basic date and time types".docs.python.org.Retrieved 11 January 2020
- "8.2. calendar — General calendar-related functions".docs.python.org.Retrieved 13 January 2020
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python中有關(guān)時(shí)間日期格式轉(zhuǎn)換問題
- 使用Python將字符串轉(zhuǎn)換為格式化的日期時(shí)間字符串
- python 將日期戳(五位數(shù)時(shí)間)轉(zhuǎn)換為標(biāo)準(zhǔn)時(shí)間
- python中時(shí)間、日期、時(shí)間戳的轉(zhuǎn)換的實(shí)現(xiàn)方法
- Python3日期與時(shí)間戳轉(zhuǎn)換的幾種方法詳解
- Python日期時(shí)間對(duì)象轉(zhuǎn)換為字符串的實(shí)例
- python2.7 json 轉(zhuǎn)換日期的處理的示例
- 詳解python 字符串和日期之間轉(zhuǎn)換 StringAndDate
- python實(shí)現(xiàn)字符串和日期相互轉(zhuǎn)換的方法
相關(guān)文章
python中迭代器(iterator)用法實(shí)例分析
這篇文章主要介紹了python中迭代器(iterator)用法,實(shí)例分析了Python中迭代器的相關(guān)使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Django對(duì)models里的objects的使用詳解
今天小編就為大家分享一篇Django對(duì)models里的objects的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python3.x爬蟲下載網(wǎng)頁圖片的實(shí)例講解
今天小編就為大家分享一篇Python3.x爬蟲下載網(wǎng)頁圖片的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct的具體使用
在C/C++語言中,struct被稱為結(jié)構(gòu)體。而在Python中,struct是一個(gè)專門的庫,用于處理字節(jié)串與原生Python數(shù)據(jù)結(jié)構(gòu)類型之間的轉(zhuǎn)換。本文就詳細(xì)介紹struct的使用方式2021-06-06
Python3實(shí)現(xiàn)的反轉(zhuǎn)單鏈表算法示例
這篇文章主要介紹了Python3實(shí)現(xiàn)的反轉(zhuǎn)單鏈表算法,結(jié)合實(shí)例形式總結(jié)分析了Python基于迭代算法與遞歸算法實(shí)現(xiàn)的翻轉(zhuǎn)單鏈表相關(guān)操作技巧,需要的朋友可以參考下2019-03-03

