在您作为开发人员或数据科学家的职业生涯中,您将不得不处理日期和时间。幸运的是,Python 有几个方便的库可以使这一切变得更容易。
在本文中,我们将快速回顾 datetime 模块,然后研究 日历 和 Arrow 模块。
作为使用 Python 的程序员、开发人员、数据分析师或数据科学家,您可能需要经常处理日期和时间数据。幸运的是,Python 的
datetime
,
calendar
、和
arrow
库可以简化您的任务。让我们看看它们是如何工作的,然后重点介绍如何使用日历和 Arrow 库。
如何在 Python 中使用日期时间
我们已经在这个博客中讨论了 datetime 模块 ,因此在转到日历和箭头模块之前,我将做一个快速回顾。
该
datetime
和
datetime
等类型
timedelta
。它还允许您检索时区信息。例如:
# import
import datetime
# get current date and time
datetime_now = datetime.datetime.now()
print(datetime_now)
输出:
2021-07-28 15:10:08.773252
我们还可以以不同的格式将日期打印为字符串:
# Import
from datetime import datetime
# Set a date as a string
date = "11/07/2021 10:25:32"
# Print date as dd/mm/yyyy format
date_obj1 = datetime.strptime(date, "%d/%m/%Y %H:%M:%S")
print("date and time =", date_obj1)
# Print date as mm/dd/yyyy format
date_obj2 = datetime.strptime(date, "%m/%d/%Y %H:%M:%S")
print("date and time =", date_obj2)
输出:
date and time = 11/07/2021 10:25:32
date and time = 11/07/2021 10:25:32
该
strftime()
方法允许您将时间格式化为可读字符串。在下面的示例中,我们以可读格式输出月份:
# Import
import datetime
# Set a date
date = datetime.datetime(2018, 6, 1)
# Print month in a readable format
print(date.strftime("%B"))
结果:
June
这里
strftime()
有一份方便的备忘单
。请随意使用。稍后,我们将看到一种使用该
arrow
模块检索此信息的更有效的方法。
该
timedelta()
函数可让您进行比较操作并测量时间持续时间:
# Import
from datetime import datetime, timedelta
# Using current time
current_time = datetime.now()
# Print current time
print ("Current time: ", str(current_time))
# Calculate future date in three years time
date_aft_3yrs = current_time + timedelta(days = 1095)
# Calculate future date in five days
date_aft_5days = current_time + timedelta(days = 5)
# Print calculated future_dates
print('In three years from now, the date will be:', str(date_aft_3yrs))
print('In five days from now, the date will be:', str(date_aft_5days))
我们在上一个示例中介绍了简单
datetime
对象,即没有时区信息。但是,使用时间感知对象是一种很好的做法。我们可以使用模块设置时区
pytz
,因为
datetime
单独使用模块是不够的。如果您尚未安装
pytz
,您可以使用
pip
:
pip install pytz
这是一个工作示例:
import datetime
import pytz
utc_now = pytz.utc.localize(datetime.datetime.utcnow())
eur_now = utc_now.astimezone(pytz.timezone("Europe/Paris"))
eur_now == utc_now
现在我们有两个时区不同的时间对象,但它们是相等的。我们可以按如下方式打印它们:
utc_now.isoformat()
协调世界时的输出是:
'2021-07-28T07:39:51.567436+00:00'
现在,让我们把巴黎的欧洲时间改回来:
eur_now.isoformat()
巴黎的欧洲时间输出为:
'2021-07-28T09:39:51.567436+02:00'
有关该
datetime
模块的更多信息,可以查看
Python datetime 文档
.
如何在 Python 中使用日历
Python 有一个很有吸引力的内置模块,
calendar
可让您方便地在 Python 中显示和使用日历。
要显示 2021 年 7 月的日历,你可以输入:
import calendar
mth_calendar = calendar.TextCalendar(0).formatmonth(2021, 7)
print(mth_calendar)
结果如下:
要显示整个 2021 年日历,我们可以输入以下内容:
import calendar
yr_calendar = calendar.TextCalendar(0).formatyear(2021)
print(yr_calendar)
我们还可以通过修改参数来更改第一个工作日(星期一/星期日)
firstweekday
和
0
之间的整数来实现此目的
6
,其中星期一 =
0
和星期日 =
6
.
import calendar
# Set Thursday as first day of the month
mth_calendar = calendar.TextCalendar(firstweekday=3).formatmonth(2021, 7)
print(mth_calendar)
另外,通过更改
TextCalendar
为
HTMLCalendar
,我们可以以 HTML 形式显示日历。它将返回日历及其相应的 HTML 标签以显示在网页上。语法如下:
import calendar
mth_calendar = calendar.HTMLCalendar(firstweekday=0).formatmonth(2021, 7)
print(mth_calendar)
接下来,让我们看看如何
calendar.monthrange(year, month)
返回月份的第一天以及该特定月份的天数。例如:
calendar.monthrange(2021, 8)
输出:
(6, 31)
这意味着 2021 年 8 月 1 日是星期日,该月有 31 天。
我们还可以使用该
isleap()
方法检查某一年份是否为闰年。如果该值是闰年,它将返回布尔值 True,如果不是闰年,它将返回 False。以下是一个例子:
import calendar
print(calendar.isleap(2021))
结果如下:
False
接下来,
calendar.weekday(year, month, day)
将返回给定日期的星期几。例如,1789 年 7 月 14 日(选择用来纪念法国国庆日的日期)是星期几?
import calendar
calendar.weekday(1789, 7, 14)
输出:
1
那天是星期二。
如果您想更详细地了解日历模块,您可以 在这里找到官方文档 .
如何在 Python 中使用 Arrow
Arrow 是另一个很棒的 Python 库,以时间之箭命名。这是时间的单向或“不对称”的概念。时间之箭指的是我们总是看到事物朝着特定的(单向)方向发展。它指的是不可避免的“时间流向”未来。
与
datetime
内置模块
calendar
不同
arrow
需要安装。您可以使用以下方法执行此操作
pip
:
pip install arrow
我们可以用来
arrow
获取协调世界时:
import arrow
utc = arrow.utcnow()
print(utc)
输出为:
2021-07-28T14:04:48.910069+00:00
另外,我们可以使用箭头来获取当地时间:
import arrow
now = arrow.now()
print(now)
结果:
2021-07-28T22:06:14.795852+08:00
如果我们想将字符串解析为日期格式,我们需要使用
get()
:
# Import
import arrow
# Date in string format
date_str ='2021-07-20 15:20:35'
# Parse string into date
date_f = arrow.get(date_str, 'YYYY-MM-DD HH:mm:ss')
# Print the date
print(date_f)
输出:
2021-07-20T15:20:35+00:00
请注意,Arrow 使用比更简单、更短的语法来解析
datetime
日期
strptime()
.
也可以从字符串中检索日期,如下面的句子所示:
# Import
import arrow
# Retrieve date from string
get_dt_f_str = arrow.get('Olympic games started on 23 July 2021', 'D MMMM YYYY')
# Print date from string
print(get_dt_f_str)
结果:
2021-07-23T00:00:00+00:00
接下来,我们可以用来
format()
将日期格式化为字符串:
# Import
import arrow
# Get local time
now = arrow.now()
# Print the year
year = now.format('YYYY')
print("Year: {0}".format(year))
# Print the date as year, month, day
date = now.format('YYYY-MM-DD')
print("Date: {0}".format(date))
# Print the date and the time
date_time = now.format('YYYY-MM-DD HH:mm:ss')
print("Date and time: {0}".format(date_time))
# Print the date, time and time zone
date_time_zone = now.format('YYYY-MM-DD HH:mm:ss ZZ')
print("Date and time and zone: {0}".format(date_time_zone))
输出:
Year: 2021
Date: 2021-07-28
Date and time: 2021-07-28 22:12:02
Date and time and zone: 2021-07-28 22:12:02 +08:00
我们还可以检索星期几:
# Import
import arrow
# Get the date
bastille_day = arrow.get('1789-07-14')
# Print the weekday and format it in a readable way
print(bastille_day.weekday())
print(bastille_day.format('dddd'))
输出:
1
Tuesday
我们也可以通过转换来获取世界其他地方的时间。以下是一个例子:
# Import
import arrow
# Get local time
utc = arrow.utcnow()
# Get time in different parts of the world
print("Time in US/Pacific:", utc.to('US/Pacific').format('HH:mm:ss'))
print("Time in Europe/Paris:", utc.to('Europe/Paris').format('HH:mm:ss'))
print("Time in Asia/Tokyo:",utc.to('Asia/Tokyo').format('HH:mm:ss'))
输出:
Time in US/Pacific: 07:18:37
Time in Europe/Paris: 16:18:37
Time in Asia/Tokyo: 23:18:37
接下来让我们转换时间:
# Import
import arrow
# Get current time
now = arrow.now()
# Shift time 3 hours into the future
print("In 3 hours, it will be:", now.shift(hours=3).time())
# Shift time 3 days into the future
print("In 3 days, the date will be:", now.shift(days=3).date())
# Shift time 5 years into the past
print("5 years ago, the date was:", now.shift(years=-5).date())
输出:
In 3 hours, it will be: 01:23:20.609249
In 3 days, the date will be: 2021-07-31
5 years ago, the date was: 2016-07-28
你可以混合使用不同的参数,例如,
now.shift(days=3, hours=6)
.
此外,我们可能对为人类格式化时间感兴趣,以便它比我们得到的长字符串更具可读性。
该
humanize()
方法是一种方便且强大的方法,可以实现人性化的输出。让我们写一个例子:
# Import
import arrow
# Get current time
now = arrow.now()
# Get a readable information about time
moment_ago = now.shift(minutes=-15).humanize()
print(moment_ago)
# Get human-readable information about time
future_moment = now.shift(hours=5).humanize()
print(future_moment)
输出:
15 minutes ago
in 5 hours
另一方面,我们可以
dehumanize()
使日期更加机器友好:
# Import
import arrow
# Get current time
current_time = arrow.utcnow()
# Set time two days ago
two_days_ago = current_time.dehumanize("2 days ago")
print(two_days_ago)
结果:
2021-07-26T14:31:33.975369+00:00
该
arrow
和
datetime
更易读的输出
calendar
.
与 相比
datetime
,arrow 使创建、操作、格式化和转换日期、时间、时间戳、时区等更加直接。它需要的代码更少,对其他导入或库的依赖也更少。总体而言,使用 arrow 模块比 Python 的内置模块更高效。
当我们学习新东西时, 阅读 官方文档
练习使用 Python 的日期和时间模块
我们回顾了
datetime
模块,并介绍了
calendar
Python 中的 和箭头模块。这涉及了相当多的内容,我希望它能帮助您了解如何使用 Python 操作日期和时间数据。
尝试运行这些代码片段并使用它们来巩固您的知识。
如果您想获得一些使用 Python 数据科学模块的实践经验,我推荐 LearnSQL.com 的 Python 数据科学 迷你课程。它的五门课程和 300 多个练习将为您提供大量练习!或者查看我们的 Python 数据处理 迷你课程,它全面解释了如何处理不同文件格式的各种数据。祝您学习愉快!
发表评论 取消回复