在您使用 Python 的过程中,您肯定会需要处理日期、时间或两者。通过本简短教程学习 Python 中日期和时间的所有基础知识。
需要计算自给定日期以来过了多长时间?使用 Python 中的日期和时间对象?在本初学者指南中,我们将了解如何使用 Python 中的这两种关键数据类型编写程序。
Python 日期时间类
Python 有五个用于处理日期和时间对象的类:
- 日期 ——仅包含日期信息(年、月、日)。
- 时间 ——指与天无关的时间(时、分、秒、微秒)。
- datetime—— 结合日期和时间信息。
- timedelta—— 表示两个日期或时间之间的差值。
- tzinfo – 用于操作时区信息的抽象类。
这些类在模块中提供
datetime
。因此,您需要通过导入所有必需的类来开始处理日期和时间,如下所示:
# Starting with the required imports
from datetime import datetime, date, time, timedelta
现在让我们看看使用这些类实际上可以做什么。
获取当前日期和时间
首先,Python 允许您获取当前日期和时间,这一点并不令人意外。您还可以访问这些对象的单独组件。
要
获取当前日期
,可以使用
today()
的方法
date
,即编写
date.today()
.
# Getting current date
today = date.today()
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
print ("Today's date is ", today)
print ("\n", "Year:", today.year,
"\n", "Month:", today.month,
"\n","Day:", today.day,
"\n","Weekday:", today.weekday(),
"\n","Weekday (name):", days[today.weekday()])
Today's date is 2019-02-22
Year: 2019
Month: 2
Day: 22
Weekday: 4
Weekday (name): Friday
这将 仅返回今天的日期, 而不返回确切的时间信息。但是,日期有一组组件,您可以使用 日期对象的相应属性 它们。如您在上面的示例中所见,可以访问 年月 , 日 , ,甚至是 星期 几 .
请注意,工作日以索引形式提供,0 表示星期一,1 表示星期二,2 表示星期三,依此类推。因此,如果您想打印工作日的名称,您有两个选择:
-
创建一个表示星期几名称的字符串列表;使用
date.weekday()
方法的输出作为索引访问其各个元素。 -
创建索引到其对应字符串名称的映射,然后使用返回的索引
date.weekday()
作为字典的键。
这两种方法都没有比另一种更有效率,所以请按照您喜欢的方式使用!
现在让我们看看如何使用
获取当前时间
,以及访问其各个组件。使用
now()
datetime 类的方法,您将获得有关当前时间的完整信息,包括日期。您可以
通过将输出传递
给该
datetime.now()
仅获取时间信息
datetime.time()
。请看这个例子:
# Getting current time
time = datetime.now()
print("It's", time, "now.")
print ("\n", "Time:", datetime.time(time),
"\n", "Hour:", time.hour,
"\n","Minute:", time.minute,
"\n","Second:", time.second,
"\n","Microsecond:", time.microsecond)
It's 2019-02-23 13:10:12.387096 now.
Time: 13:10:12.387096
Hour: 13
Minute: 10
Second: 12
Microsecond: 387096
与我们操作对象的方式类似
date
,您可以使用相应的属性访问时间对象的各个组件。因此,您可以分别访问当前
小时、
,
分钟
,
秒
和
微秒
.
创建日期时间对象
显然,您还可以
创建 datetime 对象
,其中包含从 1 年到 9999 年的任何合理的日期和时间。如果您需要一个仅包含日期而不包含时间信息的对象,只需将年份
、
,
月份
和
日期
给
date()
函数。
# Creating date object
einstein_birthday = date(1879, 3, 14)
print ('Einstein\'s birthday is on {}.'.format(einstein_birthday))
Einstein's birthday is on 1879-03-14.
# Creating datetime object
einstein_birthtime = datetime(1879, 3, 14, 8, 34, 55, 2345)
print ('Einstein was born on {}.'.format(einstein_birthtime))
Einstein was born on 1879-03-14 08:34:55.002345.
如果我们想象一下爱因斯坦出生的确切时间是已知的,我们可以创建一个 datetime 对象,它不仅包含日期,还包含事件的时间。要创建这样的对象,我们需要将必要的参数传递给函数
datetime()
,即
年
,
、月、
,
日、
,
时
,
、分、
,
秒
和
微秒
.
请注意,
年
,
月
和
日
是该函数唯一必需的参数
datetime()
;如果不提供其他参数,它们将
默认
为零
格式化日期时间
到目前为止,我们使用的日期和时间都以默认格式“YYYY-MM-DD HH:MM:SS”打印。但是,Python 为您提供了更大的日期和时间格式灵活性。此外,您只需掌握
一种格式化方法
即可获得您想要的任何格式的日期和时间:
strftime()
.
要更改 datetime 对象的格式,您只需将适当的格式传递给该
strftime()
方法即可。格式使用特殊指令来表示,如下所示:
- %Y – 带世纪的年份(例如,2019)。
- %y — 不带世纪的年份(例如 19)。
- %B — 月份全名(例如,March)。
- %b — 月份的缩写名称(例如,Mar)。
- %m – 月份为零填充整数(例如 03)。
- %d – 以零填充的整数表示月份中的日期(例如 25)。
- %A – 星期几的全名(例如,星期一)。
- %a – 以缩写名称表示星期几(例如,Mon)。
让我们看看如何使用不同的格式:
# Formatting a date object
einstein_birthday = datetime(1879, 3, 14)
print ('Einstein was born on {}.'.format(einstein_birthday))
print ('Einstein was born on {}.'.format(einstein_birthday.strftime('%b %d, %Y')))
print ('Einstein was born on {}.'.format(einstein_birthday.strftime('%a, %B %d, %Y')))
print ('Einstein was born on {}.'.format(einstein_birthday.strftime('%A, %B %d, %Y')))
print ('Einstein was born on {}.'.format(einstein_birthday.strftime('%d.%m.%Y')))
print ('Einstein was born on {}.'.format(einstein_birthday.strftime('%d/%m/%y')))
Einstein was born on 1879-03-14 00:00:00.
Einstein was born on Mar 14, 1879.
Einstein was born on Fri, March 14, 1879.
Einstein was born on Friday, March 14, 1879.
Einstein was born on 14.03.1879.
Einstein was born on 14/03/79.
实际上,您可以按照相同的方式格式化时间,请记住:
- '%H' 代表24小时制的小时数。
- '%I' 代表 12 小时格式的小时。
- '%M' 表示分钟。
- '%S' 表示秒。
- “%p”表示时间是上午还是下午。
# Formatting a time object
meeting_time = datetime.time(datetime (2019, 3, 25, 20, 30))
print ('Meeting starts at {}.'.format(meeting_time))
print ('Meeting starts at {}.'.format(meeting_time.strftime('%H:%M')))
print ('Meeting starts at {}.'.format(meeting_time.strftime('%I:%M %p')))
Meeting starts at 20:30:00.
Meeting starts at 20:30.
Meeting starts at 08:30 PM.
将字符串转换为日期时间对象
如果数据集中的日期或时间以字符串形式表示,则可以使用该
strptime()
方法轻松将它们转换为 datetime 对象。您只需指定字符串表示日期或时间的格式即可。
例如,假设您需要从文本正文中提取日期,这些日期表示为“2019 年 3 月 25 日”。您只需将此字符串和相应的格式传递给该
strptime()
方法。看一看:
# Converting strings to dates
date = datetime.strptime('March 25, 2019', '%B %d, %Y')
print(date)
2019-03-25 00:00:00
需要更多练习在 Python 中将字符串转换为日期时间对象?查看我们关于 在 Python 中使用字符串的 .
比较日期时间对象
假设我们不仅知道阿尔伯特·爱因斯坦的确切出生时间,还知道艾萨克·牛顿和斯蒂芬·霍金的确切出生时间。我们如何在 Python 中比较日期和时间对象?
其实很简单!您可以
compare
date
and
datetime
objects
比较日期和日期时间对象
with the greater-than (
>
) and less-than (
<
) operators.
# Comparing times
einstein_birthtime = datetime(1879, 3, 14, 8, 34, 55, 2345)
newton_birthtime = datetime(1643, 1, 4, 15, 55, 4, 15432)
hawking_birthtime = datetime(1942, 1, 8, 22, 13, 43, 78432)
einstein_birthtime > newton_birthtime
True
hawking_birthtime < einstein_birthtime
False
获取时间间隔
我们知道爱因斯坦出生在牛顿之后,但晚了多久呢?让我们来一探究竟吧!
# Calculating the difference between two dates
delta = einstein_birthday - newton_birthday
print (delta)
print ('Einstein was born {} years later than Newton.'.format(round(delta.days/365)))
86266 days, 0:00:00
Einstein was born 236 years later than Newton.
从示例中可以看出,您可以像计算数字一样计算两个日期对象之间的差值。结果以天数表示。
我们在这里计算的 delta 是
a
timedelta
object
。它表示两个日期或时间之间的差异。这个差异可以用天、秒、微秒、毫秒、分钟、小时甚至周来表示。此外,请注意,结果可以是
正数
,
、
负数
零
.
回到我们的物理学家,让我们来看看爱因斯坦去世到霍金出生之间过了多少天:
# Calculating the difference between two dates with a negative result
einstein_death = datetime(1955, 4, 18)
hawking_birthday = datetime(1942, 1, 8)
delta = hawking_birthday - einstein_death
print(delta)
-4848 days, 0:00:00
我们得到了否定的结果,因为爱因斯坦去世时霍金已经13岁了。
在 Python 中创建 timedelta 对象
在前面的例子中,
timedelta
对象是我们日期时间算术运算的结果,但我们也可以显式创建这些对象并使用它们来定义新的日期和时间对象。例如,给定一个特定的日期,我们可以
通过加上或减去特定的天数、小时数、周数等来
计算新的日期。
# Calculating the date 100 days before Einstein's birth
einstein_100days_before = einstein_birthday + timedelta(days=-100)
print ('Einstein was born 100 days after {}.'.format(einstein_100days_before))
Einstein was born 100 days after 1878-12-04 00:00:00.
# Calculating the date 4 weeks after Einstein's birth
einstein_4weeks_after = einstein_birthday + timedelta(weeks=4)
print ('Einstein was 4 weeks old on {}.'.format(einstein_4weeks_after))
Einstein was 4 weeks old on 1879-04-11 00:00:00.
从示例中可以看出,当我们将负数作为参数传递给 时
timedelta()
,给定的持续时间将从原始日期中减去(例如,减去 100 天)。另一方面,当我们传递正数时,我们会将此持续时间添加到我们的日期对象中(例如,加上 4 周)。
Python 日期和时间——学会了!
现在您已经了解了如何从头开始或从字符串创建日期时间对象、如何获取当前日期和时间、如何比较两个日期以及如何设置日期和时间的格式。您已经了解了所有基础知识,因此下一步就是练习!为此,请务必查看我们的 Python 基础知识第 3 部分 课程;它有大量 日期和时间操作相关的 交互式练习 和一些 。
您可能还会发现查看 《Python 基础知识第 1 部分》 和 《Python 基础知识第 2 部分》 可以帮助您复习 条件语句、 , 循环、 , 列表 , 、字典 和其他基本 Python 编程概念的知识。
如果你想在职业生涯中取得长足进步,一定要投入一些时间和精力进行专业发展和继续教育。你永远不知道这些新获得的技能中哪些会在你的下一次晋升中发挥关键作用——但它们肯定会!
发表评论 取消回复