第二章:25+ Python 数据操作教程(第十二节python datetime 模块以及如何使用它来处理日期、时间和日期时间格式的列-变量)

在本教程中,我们将介绍 python datetime 模块以及如何使用它来处理日期、时间和日期时间格式的列(变量)。它包含各种实际示例,可帮助您增强使用 Python 函数处理日期和时间的信心。一般来说,日期类型列不容易操作,因为它面临很多挑战,例如处理闰年、一个月中的不同天数、不同的日期和时间格式,或者日期值是否以字符串(字符)格式存储ETC。

目录

简介:日期时间模块

日期

创建日期对象

从日期值中提取日、月和年

自定义日期格式

时间

如何从时间值获取小时、分钟和秒

如何将时间转换为 AM PM 格式

处理日期和时间

创建日期时间对象

如何在Python中将字符串转换为日期时间?

如何获取当前时间?

如何获取当前星期几?

计算未来或过去的日期

两个日期之间的差异

如何处理 pandas 数据框上的日期?

如何处理不同时区


简介:日期时间模块

它是一个 python 模块,提供了几个处理日期和时间的函数。它有如下四个类,本文的后半部分将解释这些类的工作原理。
  1. 1、约会时间
  2. 2、日期
  3. 3、时间
  4. 4、从定时
  1. 1、选择 2018 年 6 月 30 日活跃的所有储蓄账户持有人并检查他们的状态是否仍然活跃
  2. 2、识别过去 3 个月内提交超过 20 次索赔的被保险人
  3. 3、识别过去 6 个月内进行多次交易的客户
  4. 4、从时间戳值中提取日期
导入日期时间模块
您可以使用以下命令导入或加载日期时间模块 -
import datetime
您不需要安装此模块,因为它与 python 软件的安装捆绑在一起。

日期

这里我们使用datetime.date用于表示日历日期值的类。today()方法用于获取当前日期。
datetime.date.today()

Output
datetime.date(2019, 7, 19)
为了将其显示为正确的日历日期,我们可以将其包装在print( )命令中。
print(datetime.date.today())

Output
2019-07-19

创建日期对象

日期类遵循如下所示的语法:
日期(年、月、日)
dt = datetime.date(2019, 10, 20)

print(dt)

Output
2019-10-20

从日期值中提取日、月和年

dt.day
20

dt.month
10

dt.year
2019

自定义日期格式

您可以通过使用方法定义日期格式来自定义日期格式strftime。它将日期对象转换为字符串。
dt.strftime("%d-%m-%Y")
Output
20-10-2019
%d指的是一月中的某一天。在 中20-10-2019,%d 返回 20。
%m指一年中的月份。在 中20-10-2019,%m 返回 10。
%Y指年份。字母“Y”为大写。在 中20-10-2019,%Y 返回 2019。
%y指两位数格式的年份。在 中20-10-2019,%y 返回 19。

其他流行的格式代码
  • %a返回工作日的前三个字母Sun
  • %A返回工作日的完整名称Sunday
  • %b返回该月的前三个字母Oct
  • %B返回月份的完整名称October
dt.strftime("%d/%m/%Y")
20/10/2019

dt.strftime("%b %d, %Y")
Oct 20, 2019

dt.strftime("%B %d, %Y")
October 20, 2019

dt.strftime("%a %B %d, %Y")
Sun October 20, 2019

dt.strftime("%A %B %d, %Y")
Sunday October 20, 2019

dt.strftime("%A, %B %d, %Y")
Sunday, October 20, 2019

时间

时间值是用datetime.time类定义的。它遵循如下所示的语法 -
datetime.time(时、分、秒、微秒)
t = datetime.time(21, 2, 3)
print(t)
21:02:03

如何从时间值获取小时、分钟和秒

t.hour
21

t.minute
2

t.second
3

t.microsecond
0

如何将时间转换为 AM PM 格式

  • %I将 24 小时时间格式转换为 12 小时格式。
  • %p根据时间值返回 AM PM。
  • %H返回时间值的小时数。
  • %M返回时间值的分钟。
  • %S返回时间值的秒数。
t.strftime("%I:%M %p")
09:02 PM

处理日期和时间

datetime 库还有另一个名为datetime.datetimeclass 的类,用于表示日期加时间。您可以将其称为时间戳。now()today()datetime 类的方法用于提取当前日期和时间。
dt = datetime.datetime.now()
print(dt)

Output
2019-07-20 17:05:05.699416
dt.strftime("%c")
Sat Jul 20 17:05:05 2019

dt.strftime("%A %B %d %X")
Saturday July 20 17:05:05

dt.strftime("%A %B %d %H:%M")
Saturday July 20 17:05

创建日期时间对象

datetime 类的语法如下 -
日期时间(年、月、日、时、分、秒、微秒)
dt = datetime.datetime(2019, 7, 20, 10, 51, 0)
print(dt)
2019-07-20 10:51:00

dt.strftime('%d-%m-%Y %H-%M')
20-07-2019 10-51

如何在Python中将字符串转换为日期时间?

from dateutil.parser import parse
print(parse('March 01, 2019'))

2019-03-01 00:00:00

如何获取当前时间?

我们可以使用上一节中使用的相同函数,并使用time()方法从返回值中提取时间。
print(dt.time())

如何获取当前星期几?

假设您想提取天数。周一为 1,周日为 7。在下面的示例中,它返回 6,因为它是 2019 年 7 月 20 日星期六。
dt.isoweekday()

计算未来或过去的日期

通过使用timedelta,您可以添加或减去天、周、小时、分钟、秒、微秒和毫秒。当您想要计算未来或过去的日期时,它非常有用。假设您需要识别过去 30 天内注册产品的所有客户。要解决此问题,您需要计算今天日期之前 30 天的日期。
#30 days ahead
delta = datetime.timedelta(days=30)
print(dt + delta)
2019-08-19 10:51:00

#30 days back
print(dt - delta)
2019-06-20 10:51:00

delta = datetime.timedelta(days= 10, hours=3, minutes=30, seconds=30)
print(dt + delta)
2019-07-30 14:21:30

delta = datetime.timedelta(weeks= 4, hours=3, minutes=30, seconds=30)
print(dt + delta)
2019-08-17 14:21:30
在 中timedelta,缺少月份和年份选项,这意味着您无法按月或年计算未来的日期增量。为了完成这个任务,我们可以使用dateutilpackage.json 来完成这个任务。让我们通过提交下面的代码来导入这个包 -
from dateutil.relativedelta import *
如果您的系统上尚未安装,请通过运行此命令进行安装pip install python-dateutil
#1 Month ahead
print(dt + relativedelta(months=+1))
2019-08-20 10:51:00

#1 Month Back
print(dt + relativedelta(months=-1))

如果您想知道这relativedelta(months=+1)与 有何不同datetime.timedelta(days=30),请观察这两个命令的返回值(结果)。
由于 7 月有 31 天,因此使用此datetime.timedelta(days=30)返回2019-08-19 10:51:00提前 30 天。relativedelta(months=+1)返回2019-08-20 10:51:00,这是完整的 1 个月。

#Next month, plus one week
print(dt + relativedelta(months=+1, weeks=+1))

#Next Year
print(dt + relativedelta(years=+1))
考虑闰年
dateutil 包中的relativedelta 方法在计算未来或过去的日期时负责闰年。2000 年是闰年,所以二月有 29 天。但明年2月只有28天。
print(datetime.date(2000, 2, 29)+ relativedelta(years=+1))

Output
2001-02-28

两个日期之间的差异

假设您需要计算两个日期之间的天数。当您需要计算给定信息的客户的任期时,这是一个非常常见的数据问题陈述 - 他们开设帐户的时间(开始日期)和帐户关闭的时间(结束日期)。
date1 = datetime.date(2020, 10, 25)
date2 = datetime.date(2019, 12, 25)
diff = date1- date2
diff.days

Output
305
您如何计算两个日期之间的月数?
一种方法是计算天数,然后除以 30 以获得月数。但它并不总是正确的,因为有些月份有 31 天。
不完全证明的解决方案
int(diff.days/30)
正确的解决方案
date1.month - date2.month + 12*(date1.year - date2.year)
怎么运行的?
  • date1.month - date2.month returns -2
  • 12*(date1.year - date2.year) returns 12
  • -2 + 12 = 10
重要提示
假设您要计算 31/10/2018 和 01/11/2018 之间的月数,上述建议的方法将返回 1,因为两个日期相差一个月。您可能会发现它不正确,因为两个日期之间的天数是1。您知道SAS软件中的INTCK函数(默认设置)也返回1吗?返回1有什么用?当您需要将时间序列数据排序到容器中时,它非常有用。例如,每日数据可以累积为每月数据,以作为每月系列进行处理。如果您期望月份数为 0,则可以使用上面“非完整证明解决方案”下显示的代码。

如何处理 pandas 数据框上的日期?

在现实世界中,我们通常从外部文件导入数据并将其存储在pandas DataFrame 中。因此,了解如何在 DataFrame 上执行日期和时间操作非常重要。让我们创建一个示例数据框以进行说明。
df=pd.DataFrame({"A":["2019-01-01", "2019-05-03", "2019-07-03"],
                 "B":["2019-03-02", "2019-08-01", "2019-10-01"] })
让我们检查一下列类型。
df.dtypes
这里 A 列和 B 列都是字符串(字符值)。
A    object
B    object
dtype: object
datetime由于这些变量存储在字符串中,因此 需要将列转换为对象。
df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B'])
df.dtypes

A    datetime64[ns]
B    datetime64[ns]
dtype: object
为了使用 pandas 数据帧上的 A 列和 B 列计算天数,您只需计算这两列的差异。
df['C'] = df['B'] - df['A']

          A          B       C
0 2019-01-01 2019-03-02 60 days
1 2019-05-03 2019-08-01 90 days
2 2019-07-03 2019-10-01 90 days
我们计算的 C 列采用日期时间格式。为了获取整数格式的差值,您可以提交以下命令。dt使 pandas 能够使用日期时间方法。
df['C'] = (df['B'] - df['A']).dt.days
df

          A          B   C
0 2019-01-01 2019-03-02  60
1 2019-05-03 2019-08-01  90
2 2019-07-03 2019-10-01  90
获取过去 3 个月的日期
纯Python方式是在lambda中定义函数,它在所有行上运行。
from dateutil.relativedelta import *
df['D'] = df["B"].apply(lambda x: x - relativedelta(months=3))

           A          B   C          D
0 2019-01-01 2019-03-02  60 2018-12-02
1 2019-05-03 2019-08-01  90 2019-05-01
2 2019-07-03 2019-10-01  90 2019-07-01
另一种方法是使用 pandas 包的内置函数DateOffset来添加或减去天、月、年、周、小时、分钟、秒、微秒和纳秒。
df['D1'] = df['B'] - pd.DateOffset(months=3)
按日期过滤数据框

假设您只想选择 B 列的值大于 2019 年 5 月 1 日的那些行。

df[df['B']>datetime.datetime(2019,5,1)]
选择两个日期之间的数据

假设您想从 pandas 数据框中选择两个日期之间的行(假设在 5 月 1 日到 9 月 30 日之间)。

df[df.B. Between(datetime.datetime(2019,5,1), datetime.datetime(2019,9,30))]


df[(df['B'] > datetime.datetime(2019,5, 1)) & (df['B'] < datetime.datetime(2019,9,30))]

如何处理不同时区

很多时候,我们有不同时区的日期值,我们需要将其转换为当地时区。手动解决这个问题并不容易。在Python中,有一个库用于pytz设置和转换时区。

您可以通过提交此命令找到所有时区。
import pytz
pytz.all_timezones
要在特定时区(假设亚洲/加尔各答)设置日期时间对象,您可以使用名为 tzinfo 的参数。
dt = datetime.datetime(2019, 7, 20, 10, 10, 0, tzinfo=pytz.timezone('Asia/Kolkata'))
要将其转换为美国/亚利桑那州时区,我们可以使用名为 astimezone 的方法进行转换。如果您发现转换后日期已更改,因为这两个时区之间的差异超过 12 小时。
print(dt.astimezone(pytz.timezone('US/Arizona')))

Output
2019-07-19 21:17:00-07:00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值