童年趣事,Python datetime攻略:教你怎么处理日期和时刻(附试题+答案),加币汇率

译者 | Tianyu出品 | AI科技大本营

date幼年趣事,Python datetime攻略:教你怎样处理日期和时刻(附试题+答案),加币汇率time 是 Python 中处理日期的规范模块,它供给了 4 种对日期和时刻进行处理的首要方针:datetime、date、time 和 timedelta。经过本文,你会学习到怎样操作这些方针,水月镜像并用 Python 处理一些有关日期和时刻的实际问题。

本文内容:

  • datetime 简介
  • 怎样在 Python 中获取当时日期和时刻
  • 怎样创立 datetime 方针
  • 怎样在 Python 中将字符串解析为 datetime
  • 怎样将 datetime 方针转换为其他日期格局
  • 有用的 datetime 功用
  • 何时以及怎样运用 datetime.time() 类
  • 何时以及怎样运用 datetime.timedelta() 类
  • 时区问题
  • 14道操练题及参考答案


datetime 简介


在 python 中,datetime 是对日期数据进行处理的首要模块。不管何时你需求用 python 处理日期数据,datetime 都能供给所需办法。datetime 是 python 规范库的一部分,这意味着你无须独自装置它。

你能够用如下句子直接导入:


import datetime

假如说只学习 datetime 模块中的一个功用,那一定是 datetime.datetime() 类。

在 datetime 模块中,最重要也是最常用的方针便是 datetime 类。请注意,这儿说到的 datetime 是 datetime 模块的内部类。

由于模块和类的姓名相同,要注意你所运用的方针到底是哪一个。

除了 datetime.datetime 类,一起还有:

  • date 类
  • time 类
  • timedelta 类


咱们会在本篇文章中介绍所有这些内容,以及一个更高档的解析器(不属于 datetime 模块),以助于对任何方式的日期进行解析。

怎样在 Python 中获取当时日期和时刻


datetime.datetime.now() 办法能够给出当时的日期时刻:


datetime.datetime.now()
#> datetime.datetime(2019, 2, 15, 18, 54, 58, 291224)

输出成果是一个包括当时时区日期和时刻的 datetime.datetime 方针,输出次序为:年、月、日、时、分、秒、奇妙。

若想只获取日期信息,请运用 datetime.date.today():


datetime.date.today()
#> datetime.date(2019, 2, 15)

回来成果为 datetime.date 方针而不是 datetime.datetime,这是为什么呢?由于 today() 是datetime.date 类中的办法,它不包括时刻信息。

很好。

但以上的表明办法都不易读。现在咱们来用更美丽的方式将其输出:


print(datetime.date.tod个税起征点ay())
#> 2019-02-15

接下来会介绍怎样将日期和时刻转换为更多格局。

怎样创立 datetime 方针


上面介绍了怎样创立当时时刻的方针,但怎样创立一个恣意日期和时刻的方针呢?比方说这个时刻:2001-01-31::10:51:00

你能够依照相同次序将其传入 datetime.datetime():

(之后我会介绍更简略的办法)


datetime.datetime(2001, 1, 31, 10, 51, 0)
#> datetime.datetime(2001, 1, 31, 10, 51)

你也能够用 unix幼年趣事,Python datetime攻略:教你怎样处理日期和时刻(附试题+答案),加币汇率timestamp 创立一个 datetime,unixtimestamp 只是以 1970年1月1日为起点记载的秒数,例如:


mydatetime = datetime.datetime.fromtimestamp(528756281)
mydatetime
#> datetime.datetime(1986, 10, 4, 2, 14, 41)

你还能够将 datetime 转换回 unixtimestamp,如下:


mydatetime.timestamp()
#> 528756281.0


怎样在 python 中将字符串解析为 datet屠夫阿川微博ime?


上述办法要求咱们手动输入年月信息来创立 datetime 方针。但是,在处理含有字符串日期的数据集或表格时,就不太方便了。

咱们需求一种主动解析字符串方式的日期数据的办法,不管它是什么格局的,都能够将其转化为 datetime 方针。

为什么这是必需的?

由于日期信息常常作为字符串被导入数据会集。别的,日期可能是任何格局的字符串,如:‘2010 Jan 31’ 或 ‘January 31, 2010′ ,乃至 ’31-01-2010’。

那么,怎样将字符串日期转换为 datetime 呢?

dateutil 中的 parser 模块能够帮咱们将简直任何方式的字符串日期数据解析为datetime 方针:


from dateutil.parser import parse
parse('January 31, 2010')
#> datetime.datetime(2010, 1, 31, 0, 0)


示例1 - 将字符串日期解析为 datetime


将以下字符串日期解析为 datetime 方针:’31, March 31, 2010, 10:51pm’

参考答案:


from dateutil.parser import parse
parse('31, March 31, 2010, 10:51pm'幼年趣事,Python datetime攻略:教你怎样处理日期和时刻(附试题+答案),加币汇率)


你也能够运用 st公交顶rftime() 办法将 datetime 方针转换为几维度乎任何日期格局的表现方式。

怎样将 datetime 方针转换为任何格局的日期?


你能够用 strftime() 办法将 datetime 方针转换为简直任何日期格局的表现方式。你需求传入正确日期格局的表明符号作为参数:


dt = datetime.datetime(2001, 1, 31, 10, 51, 0)
print(dt.strftime('%Y-%m-%d::%H-%M'))
#> 2001-01-31::10-51


示例2-格局化 datetime 方针


将以下 datetime 方针转换为该表明办法:’31 January, 2001, Wednesday’


# Input
dt = datetime.datetime(2001, 1, 31)

参考答案:


dt.strftime('%d %B, %Y, %A')


datetimemd 有用功用


datetime 方针包括许多与日期时刻相关的有用功用。


# create a datatime obj
dt = dateti全国大学生英语比赛me.datetime(2019, 2, 15)
# 1. Get the current day of the month
dt.day #> 31
# 红掌2. Get the current day of the week
dt.isoweekday() #> 5 --> Friday
# 3. Get the current month of the year
dt.month #> 2 --> February
# 4. Get the Year
dt.year #> 2019


何时以及怎样运用 datetime.time() 类?


datetime.time() 能够用来只表明时刻部分,而不含日期。默许的输出方式为:时、分、秒、微秒。


# hours, minutues, seconds, microseconds
tm = datetime.time(10,40,1幼年趣事,Python datetime攻略:教你怎样处理日期和时刻(附试题+答案),加币汇率0,102301)
tm
#> datetime.time(10, 40, 10, 102301)


何时以及怎样运用 datetime.timedelta() 类?


'TimeDeltas' 表明详细时刻实例中的一段时刻。你能够把它们简略幻想成两个日期或时刻之间的间隔。

它常常被用来从 datetime 方针中增加或移除一段特定的时刻。

要想创立一个 datetime.timedelta 类,你需求将指定的时刻段传递给类的结构函数。可选参数包括:weeks,days (默许), hours, minutes, seconds, microseconds



td = datetime.timedelta(days=30)
td

现在我有一个表明30天间隔的 'timedelta' 方针。咱们来核算从现在开端,再过30天的日期:


print(datetime.date.today() + td)
#> 2019-03-17

相同,你也能够减掉 timedeltas。

timedeltas 供给的另一个便利是,你能够创立以天、星期、小时表明的恣意的时刻组合。它能够将组合简化:


td = datetime.timedelta(weeks=1, days=30, hours=2, minutes=40)
td
#> datetime.timedelta(days=37, seconds=9600)

假如将两个 datetime 方针相减,就会得到表明该时刻间隔的 timedelta 方针:


dt1 = datetime.datetime(2002, 1, 31, 10, 10, 0)
dt2 = datetime.dat幼年趣事,Python datetime攻略:教你怎样处理日期和时刻(附试题+答案),加币汇率etime(2001, 1, 31, 10, 10, 0)
dt1 - dt2
#> datetime.timedelta(days=365)

相同地,将两个时刻间隔相减,能够得到另一个 timedelta 方针:


td1 = datetime.timedelta(days=30) # 30 days
td2 = datetime.timedelta(weeks=1) # 1 week
td1 - td2
#> datetime.timedelta(days=23)


怎样操作时区信息?


关于时区,python 引荐的 pytz 模块并不是内置的规范库。你需求独自装置它。(在终端或指令框中输入 'pip install pytz' 即可)

那么怎样将时区设置为特定的 datetime 呢?

只需在创立 datetime 时,将 pytz 对应的 time广州丽盈塑料有限公司zone 方针传递给 tzinfo 参数。接下来,datetime 就会按所设置的时区进行显现。下面咱们创立一个 UTC 时区的 datetime 方针:


import pytz
datetime.datetime(2001, 1, 31, 10, 10, 0, tzinfo=pytz.UTC)


UTC 是 pytz 模块的内置特点。那么,怎样设置不同的时区呢?

你能够在 pytz.all_timezones 中查找你所需的时区。然后运用 pytz.timezone() 来创立相应的时区方针,它会被传递给 tzinfo 参数。


# See available time zones
pytz.all_timezones[:5]
#> ['Africa/Abidjan',
#> 'Africa/Accr癌细胞a',
#> 'Africa/Addis_Ababa',
#> 'Africa/Algiers',
#> 'Africa/Asmara']
# Set to particular timezone
dt_in = datetime.datetime(2001, 1, 31, 3, 30, 0, 0, tzinfo=pytz.timezone('Asia/Tokyo'))
dt_in
#> datetime.datetime(2001, 1疝气手术, 31, 3, 30, tzinfo=)

你能够测验将时区转换为特定的方针时区:


tgt_timezone = pytz.timezone('Africa/Addis_Ababa')
dt_in.astimezone(tgt_timezone)


实例操练

标题应战规矩:

  1. 不许看日历
  2. 即便能够经过脑算答复的问题,也要用 python 处理


操练 1:怎样将字符串日期解析为 datetime 格局?

【简单】将以下字符串日期解析为日期格局:


# Input
s1 = "2010 Jan 1"
s2 = '31-1-2000'
s3 = 'October10, 1996, 10:40pm'
# Deisred Output
#> 2010-01-01 00:00:00
#> 2000-01-31 00:00:00
#> 2019-10-10 22:40:00

参考答案:


# Input
s1 = "2010 Jan 1"
s2 = '31-1-2000'
s3 = 'October10,1996, 10:40pm'
# Solution
from dateutil.parser import parse
print(parse(s1))
print(parse(s2))
print(parse(s3))

2010-01-01 00:00:00
2000-01-31 00:00:00
2019-10-10 22:40:00


操练2:间隔你出世那天曩昔多少天了?

【简单】间隔你出世那天曩昔多少天了?


# Input
bday = 'Oct 2, 1869' # use bday

参考答案:


# Input
bday = 'Oct 2, 1869'
import 幼年趣事,Python datetime攻略:教你怎样处理日期和时刻(附试题+答案),加币汇率datetime
from dateutil.parser import parse
# Solution
td = datetime.datetime.now() - parse(bday)
td.days

54558


操练3:怎样核算两个日期之间有多少个星期六?

【中等】核算两个日期之间的星期六个数:


# Input
import datetime
d1 = datetime.date(1869, 1, 2)
d2 = datetime.date(1869, 10, 2)
# Desired Output
#> 40


参考答案:


# Input
import datetime
d1 = 紫河车datetime.date(1869, 1, 2)
d2 = datetime.date(1869, 10, 2)
# Solution
delta = d2 - d1 # timedelta
# Get all dates
dates_btw_d1d2 = [(d1 + datetime.timedelta(i)) for i in range(delta.days + 1)]
n_saturdays = 0
for d in dates_btw_d1d2:
n_saturdays += int(d.isoweekday() == 6)
print(n_saturdays)

40


操练4:间隔你本年的下一个生日还有多少天?

【简单】间隔你本年的下一个生日还有多少天?


# Input
bday = 'Oct 2, 1869' # use b'day

参考答案:


# Input
bday = 'Oct 2, 1869' # Enter birthday here
import datetime
from dateutil.parser import parse
# Solution
bdate = parse(bday)
current_bdate = datetime.date(year=datetime.date.today().year, month=bdate.month, day=bdate.day)
td = current_bdate - datetime.date.today()
td.days

228


操练5:怎样核算不规矩日期序列中的接连时刻间隔?

【简单】核算以下列表中接连的天数:


# Input
['Oct, 2, 1869', 'Oct, 10, 1869', 'Oct, 15, 1869', 'Oct, 20, 1869','Oct, 23, 1869']
# Desired Output
#> [8, 5, 5, 3]

参考答案:


# Input
datestrings = ['Oct, 2, 1869', 'Oct, 10, 1869', 'Oct, 15, 1869', 'Oct, 20, 1869', 'Oct, 23, 1869']
# Solution
import datetime
from dateutil.parser import parse
import numpy as np
dates = [parse(d) for d in datestrings]
print([d.days for d in np.diff(dates)])

[8, 5, 5, 3]


操练6:怎样将天数转换为秒数?

【简单】将间隔你下一个生日的天数转换为秒数。


# Input
import datetime
bdate = datetime.date(1869, 10, 2)
td = datetime.date.today() - bdate

参考答案:


# Input
import datetime
bdate = datetime.date(1869, 10, 2)
td = datetime.date.today() - bdate
# Solution
td.total_seconds()

4713811200.0


操练7:怎样将给定日期转换为当天开端的时刻?

【简单】将给定日期转换为当天开端的时刻:


# Input
import datetime
date = datetime.date(1869, 10, 2)
# Desired Output
#> 1869-10-02 00:00:00

参考答案:


from datetime import date, datetime
d = date(1869, 10, 2)
print(datetime.combine(d, datetime.min.time()))
#> 1869-10-02 00:00:00

1869-10-02 00:00:00


操练8江明视界:怎样在 python 中获取恣意给定日期地点月份的最终一天?

【简单】运用 python 获取以下给定日期地点月份的最终一天:


# Input
import datetime
dt = datetime.date(1952, 2, 12)
# Desired Output
#> 29

参考答案:


# Input
i日本美女图片mport datetime
dt = datetime.date(1952, 2, 12)
# Solution
import calendar
calendar.monthrange(dt.year,dt.month)[1]

29


操练9:1abp211948年的二月份有多少个周日?

【中等】核算1948年二月有几个周日

参考答案:


import datetime
from calendar import monthrange
d1 = datetime.date(1948, 2, 1)
n_days = monthrange(1948, 2)
# Get all dates
dates_btw_d1d2 = [(d1 + datetime.timedelta(i)) for i in range(n_days[1])]
n_sundays = 0
for d in dates_btw_d1d2:
n_sundays += int(d.isoweekday() == 6)
print(n_sundays) #> 4

4


操练10:怎样将给定日期转换为 "mmm-dd, YYYY"ios不越狱虚拟定位 的格局?

【简单】将给定日期转换为 “mmm-dd, YYYY” 的格局:



# input
import datetime
d1 = datetime.date('2010-09-28')
# Desired output
#> 'Sep-28, 2010'

参考答案:


# Input
import datetime
d1 = datetime.date(2010, 9, 28)
# Solution
d1.strftime('%b-%d, %Y')

'Sep-28, 2010'


操练11:怎样将日期时刻转换为 Year-Qtr 的格局?

【简单】将以下日期时刻转换为 Year-Qtr 的格局:


# input
import幼年趣事,Python datetime攻略:教你怎样处理日期和时刻(附试题+答案),加币汇率 datetime
d1 = datetime.datetime古怪的苏夕(2010, 9, 28, 10, 40, 59)
# Desired output
#> '2010-Q3'

参考答案:


# input
import datetime
d1 = datetime.datetime(2010, 9, 28, 10, 40, 59)
# Solution
f'{d1.year}-Q{d1.month//4 + 1}'

'2010-Q3'


操练12:怎样将 unix 时刻戳转换为易读的日期方式?

【中等】将以下 unix 时刻戳转换为易读的日期方式:


# Input
unixtimestamp = 528756281
# Desired Output
#> 04-October-1986

参考答案:


# In生男生女早知道put
unixtimestamp = 528756281
# Solution
import datetime
dt = datetime.datetime.fromtimestamp(528756281)
dt.strftime('%d-%B-%Y')

'04-October-1986'


操练13:怎样在不同的时区获取时刻?

【中等】假如 "亚洲/东京" 当时时刻为 ‘2001-01-31::3:30:0’,那么 "亚洲/加尔各答" 是什么时刻?


import datetime
dt_in = datetime.datetime(2001, 1, 31, 3, 30, 0, 0, tzinfo=py佛歌tz.timezone('Asia/Tokyo'))
# Desired Solution
#> datetime.datetime(2001, 1, 30, 23, 41, tzinfo=)

参考答案:


import datetime
dt_in = datetime.datetime(2001, 1, 31, 3, 30, 0, 0, tzinfo=pytz.timezone('Asia/Tokyo'))
# Solution
india_tz = pytz.timezone('Asia/Kolkata')
dt_in.astimezone(india_tz)

datetime.datetime(2001, 1, 30, 23, 41, tzinfo=)


操练14:怎样填写给定的不规矩日期序列中的缺失日期?

【困难】填写以下不规矩日期序列中的缺失日期:


# Input
['Oct 2, 1869', 'Oct 5, 1869', 'Oct 7, 1869', 'Oct 9, 1869']
# Desired Output
#> ['Oct 02, 1869', 'Oct 03, 1869', 'Oct 04, 1869', 'Oct 05, 1869',
#> 'Oct 06, 1869', 'Oct 07, 1869', 'Oct 08, 1869', 'Oct 09, 1869']

参考答案:


# Input
datestrings = ['Oct 2, 1869', 'Oct 5, 1869', 'Oct 7, 1869', 'Oct 9, 1869']
# Solution
import datetime
from dateutil.parser import parse
import numpy as np
dates = [parse(d) for d in datestrings]
d1 = np.min(dates)
d2 = np.max(dates)
delta = d2 - d1 # timedelta
# Get all dates
dates_btw_d1d2 = [(d1 + datetime.timedelta(i)).strftime('%b %d, %Y') for i in range(delta.days + 1)]
print(dates_btw_d1d2)

['Oct 02, 1869', 'Oct 03, 1869', 'Oct 04, 1869', 'Oct 05, 1869', 'Oct 06, 1869', 'Oct 07, 1869', 'Oct 08, 1869', 'Oct 09, 1869']

原文地址:

https://www.machinelearningplus.com/python/datetime-python-examples/

(*本文由AI科技大本营编译,转载请联络微信1092722531)