在您作为开发人员或数据科学家的职业生涯中,您将不得不处理日期和时间。幸运的是,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)

结果如下:

calendar in Python

要显示整个 2021 年日历,我们可以输入以下内容:

import calendar

yr_calendar = calendar.TextCalendar(0).formatyear(2021)
print(yr_calendar)
calendar in Python

我们还可以通过修改参数来更改第一个工作日(星期一/星期日) 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 数据处理 迷你课程,它全面解释了如何处理不同文件格式的各种数据。祝您学习愉快!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部