时间数据

1 时序中的基本对象

时间序列的概念在日常生活中十分常见,但对于一个具体的时序事件而言,可以从多个时间对象的角度来描 述。例如 2020 年 9 月 7 日周一早上 8 点整需要到教室上课,这个课会在当天早上 10 点结束,其中包含了 哪些时间概念?

• 第一,会出现时间戳(Date times)的概念,即’2020-9-7 08:00:00’和’2020-9-7 10:00:00’这两个时 间点分别代表了上课和下课的时刻,在 pandas 中称为 Timestamp 。同时,一系列的时间戳可以组成 DatetimeIndex ,而将它放到 Series 中后,Series 的类型就变为了 datetime64[ns] ,如果有涉及时区则 为 datetime64[ns, tz] ,其中 tz 是 timezone 的简写。

• 第二,会出现时间差(Time deltas)的概念,即上课需要的时间,两个 Timestamp 做差就得到了时间 差,pandas 中利用 Timedelta 来表示。类似的,一系列的时间差就组成了 TimedeltaIndex ,而将它放 到 Series 中后,Series 的类型就变为了 timedelta64[ns] 。

• 第三,会出现时间段(Time spans)的概念,即在 8 点到 10 点这个区间都会持续地在上课,在 pandas 利用 Period 来表示。类似的,一系列的时间段就组成了 PeriodIndex ,而将它放到 Series 中后,Series 的类型就变为了 Period 。

• 第四,会出现日期偏置(Date offsets)的概念,假设你只知道 9 月的第一个周一早上 8 点要去上课,但 不知道具体的日期,那么就需要一个类型来处理此类需求。再例如,想要知道 2020 年 9 月 7 日后的第 30 个工作日是哪一天,那么时间差就解决不了你的问题,从而 pandas 中的 DateOffset 就出现了。同 时,pandas 中没有为一列时间偏置专门设计存储类型,理由也很简单,因为需求比较奇怪,一般来说 我们只需要对一批时间特征做一个统一的特殊日期偏置。

2 时间戳

2.1 Timestamp 的构造与属性

单个时间戳的生成利用 pd.Timestamp 实现,一般而言的常见日期格式都能被成功地转换

通过 year, month, day, hour, min, second 可以获取具体的数值

在 pandas 中,时间戳的最小精度为纳秒 ns

通过 pd.Timestamp.max 和 pd.Timestamp.min

2.2 Datetime 序列的生成

一组时间戳可以组成时间序列,可以用 to_datetime 和 date_range 来生成。其中,to_datetime 能够把一

列时间戳格式的对象转换成为 datetime64[ns] 类型的时间序列

在极少数情况,时间戳的格式不满足转换时,可以强制使用 format 进行匹配

注意上面由于传入的是列表,而非 pandas 内部的 Series ,因此返回的是 DatetimeIndex ,如果想要转为 datetime64[ns] 的序列,需要显式用 Series 转化

另外,还存在一种把表的多列时间属性拼接转为时间序列的 to_datetime 操作,此时的列名必须和以下给定 的时间关键词列名一致

date_range 是一种生成连续间隔时间的一种方法,其重要的参数为 start, end, freq, periods ,它们分别表示 开始时间,结束时间,时间间隔,时间戳个数。其中,四个中的三个参数决定了,那么剩下的一个就随之确 定了。这里要注意,开始或结束日期如果作为端点则它会被包含

最后,要介绍一种改变序列采样频率的方法 asfreq ,它能够根据给定的 freq 对序列进行类似于 reindex 的操作

2.3 dt 对象

如同 category, string 的序列上定义了 cat, str 来完成分类数据和文本数据的操作,在时序类型的序列上定义 了 dt 对象来完成许多时间序列的相关操作。这里对于 datetime64[ns] 类型而言,可以大致分为三类操作:取 出时间相关的属性、判断时间戳是否满足条件、取整操作。

第一类操作的常用属性包括:date, time, year, month, day, hour, minute, second, microsecond, nanosecond, dayofweek, dayofyear, weekofyear, daysinmonth, quarter ,其中 daysinmonth, quarter 分别表示月中的第几 天和季度

在这些属性中,经常使用的是 dayofweek ,它返回了周中的星期情况,周一为 0、周二为 1,以此类推

此外,可以通过 month_name, day_name 返回英文的月名和星期名,注意它们是方法而不是属性

第二类判断操作主要用于测试是否为月/季/年的第一天或者最后一天

第三类的取整操作包含 round, ceil, floor ,它们的公共参数为 freq ,常用的包括 H, min, S (小时、分钟、 秒),所有可选的 freq 可参考 此处

2.4 时间戳的切片与索引

一般而言,时间戳序列作为索引使用。如果想要选出某个子时间戳序列,第一类方法是利用 dt 对象和布尔

条件联合使用,另一种方式是利用切片,后者常用于连续时间戳。

3 时间差

3.1 Timedelta 的生成

正如在第一节中所说,时间差可以理解为两个时间戳的差,这里也可以通过 pd.Timedelta 来构造:

生成时间差序列的主要方式是 pd.to_timedelta ,其类型为 timedelta64[ns]

与 date_range 一样,时间差序列也可以用 timedelta_range 来生成,它们两者具有一致的参数

对于 Timedelta 序列,同样也定义了 dt 对象,上面主要定义了的属性包括 days, seconds, mircroseconds, nanoseconds ,它们分别返回了对应的时间差特征。需要注意的是,这里的 seconds 不是指单纯的秒,而是 对天数取余后剩余的秒数

如果不想对天数取余而直接对应秒数,可以使用 total_seconds

与时间戳序列类似,取整函数也是可以在 dt 对象上使用的

3.2 Timedelta 的运算

时间差支持的常用运算有三类:与标量的乘法运算、与时间戳的加减法运算、与时间差的加减法与除法运算

4 日期偏置

4.1 Offset 对象

日期偏置是一种和日历相关的特殊时间差,例如回到第一节中的两个问题:如何求 2020 年 9 月第一个周一 的日期,以及如何求 2020 年 9 月 7 日后的第 30 个工作日是哪一天

从上面的例子中可以看到,Offset 对象在 pd.offsets 中被定义。当使用 + 时获取离其最近的下一个日期,当 使用 - 时获取离其最近的上一个日期

常用的日期偏置如下可以查阅这里的 文档 描述。在文档罗列的 Offset 中,需要介绍一个特殊的 Offset 对象 CDay ,其中的 holidays, weekmask 参数能够分别对自定义的日期和星期进行过滤,前者传入了需要过滤的 日期列表,后者传入的是三个字母的星期缩写构成的星期字符串,其作用是只保留字符串中出现的星期

上面的例子中,n 表示增加一天 CDay ,dr 中的第一天为 20200108 ,但由于下一天 20200109 被排除了,并 且 20200110 是合法的周五,因此转为 20200110 ,其他后面的日期处理类似

4.2 偏置字符串

前面提到了关于 date_range 的 freq 取值可用 Offset 对象,同时在 pandas 中几乎每一个 Offset 对象绑定了 日期偏置字符串(frequencies strings/offset aliases ),可以指定 Offset 对应的字符串来替代使用。

5 时序中的滑窗与分组

5.1 滑动窗口

所谓时序的滑窗函数,即把滑动窗口用 freq 关键词代替,下面给出一个具体的应用案例:在股票市场中有一 个指标为 BOLL 指标,它由中轨线、上轨线、下轨线这三根线构成,具体的计算方法分别是 N 日均值线、N 日均值加两倍 N 日标准差线、N 日均值减两倍 N 日标准差线。

对于 shift 函数而言,作用在 datetime64 为索引的序列上时,可以指定 freq 单位进行滑动

另外,datetime64[ns] 的序列进行 diff 后就能够得到 timedelta64[ns] 的序列,这能够使用户方便地观察有序 时间序列的间隔

5.2 重采样

重采样对象 resample 和第四章中分组对象 groupby 的用法类似,前者是针对时间序列的分组计算而设计的

分组对象。

在 resample 中要特别注意组边界值的处理情况,默认情况下起始值的计算方法是从最小值时间戳对应日期 的午夜 00:00:00 开始增加 freq ,直到不超过该最小时间戳的最大时间戳,由此对应的时间戳为起始值,然 后每次累加 freq 参数作为分割结点进行分组,区间情况为左闭右开。

水果销量数据集

现有一份 2019 年每日水果销量记录表

In [130]: df = pd.read_csv('data/fruit.csv')

In [131]: df.head(3) Out[131]:

        Date  Fruit  Sale

0  2019-04-18  Peach    15

1  2019-12-29  Peach    15

2  2019-06-05  Peach    19

1. 统计如下指标:

(a) 每月上半月(15 号及之前)与下半月葡萄销量的比值

(b) 每月最后一天的生梨销量总和

(c) 每月最后一天工作日的生梨销量总和

(d) 每月最后五天的苹果销量均值

2. 按月计算周一至周日各品种水果的平均记录条数,行索引外层为水果名称,内层为月份,列索引为星 期。

3. 按天计算向前 10 个工作日窗口的苹果销量均值序列,非工作日的值用上一个工作日的结果填充。



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容