在本教程中,我们将介绍 python datetime 模块以及如何使用它来处理日期、时间和日期时间格式的列(变量)。它包含各种实际示例,可帮助您增强使用 Python 函数处理日期和时间的信心。一般来说,日期类型列不容易操作,因为它面临很多挑战,例如处理闰年、一个月中的不同天数、不同的日期和时间格式,或者日期值是否以字符串(字符)格式存储ETC。
目录
简介:日期时间模块
它是一个 python 模块,提供了几个处理日期和时间的函数。它有如下四个类,本文的后半部分将解释这些类的工作原理。
其他流行的格式代码
怎么运行的?
为了使用 pandas 数据帧上的 A 列和 B 列计算天数,您只需计算这两列的差异。
您可以通过提交此命令找到所有时区。
- 1、约会时间
- 2、日期
- 3、时间
- 4、从定时
没有使用实际数据集经验的人可能没有遇到过日期列。他们可能认为处理日期很少被使用,而且也不那么重要。为了启发他们,我列出了现实世界的示例,其中使用日期时间模块可能是有益的。
- 1、选择 2018 年 6 月 30 日活跃的所有储蓄账户持有人并检查他们的状态是否仍然活跃
- 2、识别过去 3 个月内提交超过 20 次索赔的被保险人
- 3、识别过去 6 个月内进行多次交易的客户
- 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.datetime
class 的类,用于表示日期加时间。您可以将其称为时间戳。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
,缺少月份和年份选项,这意味着您无法按月或年计算未来的日期增量。为了完成这个任务,我们可以使用dateutil
package.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
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