一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python 日期的轉(zhuǎn)換及計(jì)算的具體使用詳解

Python 日期的轉(zhuǎn)換及計(jì)算的具體使用詳解

2020-04-20 11:45大夢(mèng)三千秋 Python

這篇文章主要介紹了Python 日期的轉(zhuǎn)換及計(jì)算的具體使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

日期的轉(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 模塊中可以通過(guò)創(chuàng)建 timedelta 對(duì)象表示一個(gè)時(shí)間段。如下示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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í)行操作。示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> 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ì)象能夠自行處理閏年的問(wèn)題,如下示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
>>> 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),如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
>>> 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ù)毓ぷ魅盏娜?/p>

% b

當(dāng)?shù)卦路莸目s寫

% B

當(dāng)?shù)卦路莸娜?/p>

% H

補(bǔ)零后十進(jìn)制表示的小時(shí)(24小時(shí)制)

% I

補(bǔ)零后十進(jìn)制表示的小時(shí)(12小時(shí)制)

% M

補(bǔ)零后十進(jìn)制表示的分鐘

% S

補(bǔ)零后十進(jìn)制表示的秒

 

將日期格式化為英文易讀形式,如下:

?
1
2
3
4
5
>>> 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ù):

?
1
2
3
4
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)的效果:

?
1
2
3
4
5
6
7
8
9
10
11
12
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)需求:

?
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
29
30
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@File: datetime_calendar.py
@Time: 2020/01/15 12:46:58
@Author: 大夢(mèng)三千秋
'''
 
# put the import lib here
from datetime import date, timedelta
import calendar
 
def get_month_range(start_date=None):
  '''獲取月份的范圍
 
  Args:
    start_date: 開(kāi)始的日期,默認(rèn)為 None
 
  Returns:
    返回包含月份開(kāi)始日期和結(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)
  # 返回開(kāi)始日期和結(jié)束日期的元組
  return (start_date, end_date)

在交互式解釋器中使用如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
...

注意:若在交互解釋器下無(wú)法導(dǎo)入自己寫的模塊中的方法,嘗試直接在文件所在的路徑下打開(kāi)交互解釋器。
上面的代碼中,首先將 start_date 對(duì)應(yīng)月份的第一天的日期計(jì)算出來(lái)。這里使用了 date 對(duì)象的 replace() 方法將 day 屬性設(shè)置為 1,即表示第一天。

calendar.monthrange() 函數(shù)返回指定年份指定月份第一天是星期幾,以及這個(gè)月的天數(shù)。

獲得月份天數(shù)后,加上開(kāi)始日期可得結(jié)束日期。這里需要注意的是,結(jié)束日期并不包含在這個(gè)日期范圍。在遍歷的時(shí)候,判斷條件為 first_day < last_day,不輸出 last_day 的值,以 timedelta 實(shí)例進(jìn)行遞增日期。

參考資料

來(lái)源

  1. David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013.

  2. "8.1. datetime — Basic date and time types".docs.python.org.Retrieved 11 January 2020

  3. "8.2. calendar — General calendar-related functions".docs.python.org.Retrieved 13 January 2020

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://segmentfault.com/a/1190000021592489

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品四虎 | 网站在线播放 | 四虎影视在线观看永久地址 | 男女做受快插大片 | 青青青青久久国产片免费精品 | 免费一级毛片完整版在线看 | 欧美男男gaysgays | 色男人影院 | 添逼逼视频 | 国产九九在线观看播放 | 欧美一级在线 | 亚洲系列国产系列 | 欧美一级特黄aaa大片 | 成人影院视频 | 免费欧美日韩 | 精品国产理论在线观看不卡 | 亚洲欧洲日产v特级毛片 | 69av免费视频 | 国产成年人视频 | 国产精品香蕉夜间视频免费播放 | 亚洲天堂激情 | 精品久久久久久久久久久久久久久 | 亚洲高清中文字幕 | 日本视频在线免费看 | 精品国产自在现线久久 | 国产第一综合另类色区奇米 | 九二淫黄大片看片 | 亚洲男女在线 | 花核调教 | 亚洲精品资源在线 | 国产精品免费精品自在线观看 | 村妇超级乱淫伦小说全集 | 高清在线一区二区 | 男男双性生子产乳高辣h | 热巴在公交车h文 | 四虎成人免费视频 | 1769国产精品免费视频 | 男人肌肌捅女人 | 超91精品手机国产在线 | 日韩精品在线一区二区 | 扒开老师挠尿口到崩溃刑罚 |