时间戳和日期范围的深入研究:在Pandas中使用特殊的日期和时间对象

1,490 阅读6分钟

Pandas中的Timedeltas, DateOffsets和Periods

你应该知道的特殊日期和时间对象。

在pandas日期和时间系列的第一部分中,我已经探讨了pandas时间序列的核心功能--在这篇文章中,我想看一下更多的特殊时间对象,这些对象旨在使时间戳的运算变得简单,并适合在数据中标记时间的特殊需要。

时间戳和日期范围的深入研究。在Pandas中处理日期和时间

在这篇文章中,我将使用Kaggle的 "Flat Earth on Twitter"数据集。

注意:本文所展示的功能只是Python和Pandas中不同时间对象所有功能的一小部分--我认为值得在一篇介绍性文章中介绍的那些,只是为了让大家感受一下这些对象的力量。我不想给人留下这样的印象,即这些就是这个主题的极限--无论如何,这都不是真的。

计时器

Timedeltas是代表两个时间点之间、两个时间戳之间差异的对象。

它可以使用几种不同的计量单位(如分钟、天),可以是正数或负数。

创建Timedelta的一种方法是用一个时间戳减去另一个时间戳。

你可以使用Pandas.Timedelta构造一个Timedelta对象。在这里,你需要指定你想要的Timedelta持续时间作为参数。为此,你可以使用字符串作为参数,或者提供整数作为关键字参数(还有其他几种方法,你可以在文档的解析timedeltas部分找到)。

如果我们想用一个特定的时间来增加一个Timestamp的值,我们可以使用timedeltas来进行这个操作。假设你不能等到圣诞节,所以你决定将时钟往前调3天。

注意:如果你想执行这个操作,你必须在宇宙的特定部分找到一个足够重的物体(黑洞总是一个好的选择),它可以帮助你度过等待圣诞老人的时间。

当然,我们也可以从时间戳中提取Timedeltas,更重要的是,我们可以对整个日期范围进行操作,而无需循环。

Timedeltas也可以应用于日期系列。回到我们的 "平地 "数据,我们可以很容易地在原始用户创建日期的基础上创建一个新的系列。

假设我们想知道在示例数据框架中,用户是在多少天(月、年、秒)前创建的。我们可以使用Timedelta对象来标记今天和创建日期之间的差异,用另一个Timedelta来划分,其值取决于我们想看的指标。

Timedelta对象有属性和方法来访问数据的某些部分或执行进一步的操作 - 所有这些都可以在文档中找到。

DateOffsets

DateOffsestsTimedeltas密切相关,但是,工作方式略有不同。两者背后的不同逻辑是,例如,有时连续两天的午夜时分之间的差异不是24小时:例如,夏令时可能会有点动摇。1天的Timedelta将总是在时间戳上增加24小时,而DateOffset将把时间戳向前移动到第二天,并且是原始时间戳的准确小时。

偏移对象提供了很多机会,可以将时间戳向前或向后移动到某个逻辑时间点,而不是按一个固定的时期。使用平地数据,让我们找出离用户账户创建时间最近的工作日。

正如你所看到的,如果一个时间戳是在工作时间内,"下一个_营业日 "的时间戳与原来的相同。在工作时间之外,向前滚动将时间戳移到下一个工作日--如果它碰巧在星期六应用,而不是翻转到第二天,偏移量则是寻找下一个星期一。

周期

周期是在时间对象中表示的某个时间段(小时、天、周、月、季度等)。

这背后的主要想法是,虽然时间戳代表了时间中的某个时刻,但Period(即使它可以很好地以如此高的分辨率指向某个秒)是在你的数据被标记为对象与周期性复发相关时使用的,是数据被链接到的时间范围。

一个很好的例子是销售数据:每次你在店里卖出一个甜甜圈,你都会对这次销售做一个记录,而销售的时间(一个时间戳)与每笔交易相关。一天100次的购买,导致了多达100个不同的Timestamp。然而,当你在一天结束时总结你的收入时,你有收入的总和和它实现的日子(时期)。第二天,下100个交易的时间戳,但你的每日收入只得到1个周期标记--不需要具体的时间戳。你的每日Periods也可以总结为每月、每季和每年的Periods。关键是这些时间段是重复发生的,具有一定的逻辑性,而这正是Periods所要捕捉的。

一开始,时间戳周期之间似乎没有什么大的区别--当我们开始玩算术和与周期相关的方法/属性时,重点就开始显现了。例如,频率参数在逻辑中起着巨大的作用:当对一个周期进行加减时,频率参数中指定的数量将被添加。

正如你所看到的,在上面的例子中,由于频率被设置为3小时,增加1会增加3小时(=1个单位的频率)。

创建周期范围是我认为在使用这些对象时的基本用例之一,毕竟在使用这些类型时,整个要点是要有某种有规律的复现。

周期包含了一个给定的时间跨度,对象可以返回这些时间跨度的开始和结束。创建一个周期范围,其中频率标志着季度,开始和结束日期将看起来像这样。

Period对象中可用的属性和方法的完整列表可以在文档中找到。

当然,时间戳也可以转换为Periods(反之亦然):添加平地数据集中每个用户创建的季度的开始时间,就像下面这行代码一样简单。