在 Python 中处理日期和时间有点麻烦。所幸,Python 提供了一种内置的方式来简化这种操作:Python 的 Datetime 模块。
datetime 可以帮助我们识别并处理与时间相关的元素,如日期,小时,分钟,秒,星期,月份,年份等。它提供了诸如时区和夏令时等很多服务。还可以处理时间戳数据,解析星期几,每月几号,以及从字符串格式化日期和时间等。
简而言之,datetime 是 Python 中处理日期和时间的一大利器。我们现在来深入了解一下。
本节教程中,我们将会学习很多 datetime 中很多详细的方法,包括:
- 创建日期对象 Date
- 从日期中获取年份和月份
- 从日期中获取每月几号和星期几
- 从日期中获取小时和分钟
- 从日期中获取一年中的第几周
- 日期对象转换成时间戳
- Unix 时间戳字符串转换成日期对象
- 处理时间差对象 timedelta
- 比较两个日期和时间之间的差值
- 日期格式化:strftime() 和 strptime()
- 时区处理
- 使用 Pandas 中的 datetime 对象
- 获取年,月,日,时,分
- 获取星期几与一年中的第几天
- 转换日期对象为 DataFrame 索引
学习本教程时,我们建议你在自己的机器上运行一下这些代码。
Python 的 datetime 类
在编写代码之前,有必要先了解一下 datetime 模块中提供的五个主要的对象类。根据我们具体需要执行的操作,我们可能需要使用其中的一个或多个类。
- datatime:允许我们同时操作时间和日期(月,日,年,时,秒,微秒)。
- date:允许我们排除时间仅操作日期(月,日,年)
- time:允许我们排除日期仅操作时间(时,分,秒,微秒)
- timedelta:一个用于操作日期以及测量的时间跨度
- tzinfo:一个用于处理时区的抽象类
如果还是不太理解它们之间的区别,也没关系。我们接下来就深入学习一下 datetime 的工作方式,来更好地理解和使用它们。
创建 Date 对象
首先,我们来仔细看看 datetime 对象。由于 datetime 既是模块名也是模块内的类名,所以我们要从 datetime 模块内引用 datetime 类。
然后,打印当前日期和时间来查看 datetime 对象中都包含什么。可以使用 datetime 类的 .now() 函数创建一个 datetime 对象,然后打印这个对象,之后再使用 type() 函数打印这个对象的类型。如此,我们可以看到更详细的信息。
从上面的结果中,我们可以看到 datetime_object 是 datetime 类的对象实例,对象中包含了年,月,日,时,分,秒,以及毫秒。
从 Date 中提取年份和月份
我们现在已经理解了 datetime 对象的构成,那么我们可以猜一下 date 和 time 对象是怎样的。因为我们已经知道 date 对象可以理解为 datetime 去掉了时间数据,而 time 对象可以理解为 datetime 去掉了日期数据。
我们还可以解决很多问题。比如,大多数数据集中,日期和时间信息是以字符串格式存储的。另外,我们可能不希望拿到所有的日期和时间数据,当我们在做一些诸如月度销售分析的时候,那么将信息分解到毫秒级别的用处并不大。
现在,我们来聚焦于数据科学中的一项常见任务:使用 datetime 从字符串中提取我们实际想要的元素。
为了实现这个目的,我们还需要做一些其他的工作。
使用 strptime() 和 strftime() 处理日期和时间字符串
幸运的是,datetime 提供了两个方法,strptime() 和 strftime(),可以在字符串与 datetime 对象之间互相转换。strptime() 可以读取字符串中的日期与时间信息并将其转换为 datetime 对象,而 strftime 则是将 datetime 对象转换为字符串。
当然,strptime() 并没有魔法,它不能将任意字符串转换为日期和时间,它需要一些人为地帮助,来解释它究竟识别到了什么。但是它只能识别大多数常规的日期和时间字符串格式(详情请查阅文档)。我们现在给定一个日期格式字符串 "YYYY-MM-DD",来看看 strptime() 方法能做什么。
可以看到 strptime() 方法接收两个参数:字符串 my_string 以及 "%Y-%m-%d",多出来的这个字符串告诉 strptime() 方法如何解释传入的字符串 my_string。比如,"%Y" 表示期望从字符串的前四个字符中读取年份。
这篇文档中完整地列出了这些可匹配的模式,我们将在教程后面的部分详细介绍这些方法。
你可能还注意到日期后面还跟着时间