这节依然是关于时间方面的知识.
上一节学习了如何获取日期序列的函数, 以及通过一些基本的参数设置可以使时间序列跳过休息日等.
这一节, 将要深入学习这个点, 做更自定义的设计.

通过上一节的学习, 我们知道了如何获取一个时间段的序列, 那我们很容易就可以得到 2019年2月1日到2月28日的所有工作日的时间序列:

import pandas as pd
pd.date_range(start='2/1/2019', end='2/28/2019', freq='B') 

输出:

DatetimeIndex(['2019-02-01', '2019-02-04', '2019-02-05', '2019-02-06', '2019-02-07', '2019-02-08', '2019-02-11', '2019-02-12', '2019-02-13', '2019-02-14', '2019-02-15', '2019-02-18', '2019-02-19', '2019-02-20', '2019-02-21', '2019-02-22', '2019-02-25', '2019-02-26', '2019-02-27', '2019-02-28'], dtype='datetime64[ns]', freq='B') 

那我们现在得到的就是 2019年2月的所有工作日, 但是其实在美国 2019年2月18日是华盛顿诞辰日 Washington's Birthday (President's Day), 也就是说这一天不能算成工作日, 所以 date_range()函数的第三个参数 freq 现有的几个选项值都无法满足这个需求, 而 Pandas 也提供了这种自定义的空间:

from pandas.tseries.holiday import USFederalHolidayCalendar from pandas.tseries.offsets import CustomBusinessDay usb = CustomBusinessDay(calendar = USFederalHolidayCalendar()) pd.date_range(start='2/1/2019', end='2/28/2019', freq=usb) 

输出:

DatetimeIndex(['2019-02-01', '2019-02-04', '2019-02-05', '2019-02-06', '2019-02-07', '2019-02-08', '2019-02-11', '2019-02-12', '2019-02-13', '2019-02-14', '2019-02-15', '2019-02-19', '2019-02-20', '2019-02-21', '2019-02-22', '2019-02-25', '2019-02-26', '2019-02-27', '2019-02-28'], dtype='datetime64[ns]', freq='C') 

先来看输出结果, 果然 '2019-02-18' 被略过了. 其实, 代码中每个函数的名字取得都非常好, 基本就是见字知意了, 我这里就不赘述了(如果有不明白的可以留言).
但是特别说下这个函数 --- USFederalHolidayCalendar() 美国联邦假期日历函数, 得益于 Pandas 自带的这个函数, 我们很轻松地获取到了美国实际的工作日数据. 那么是不是其他国家也都有这个函数呢? 答案是否定的, 不过没关系, 我们可以根据这个函数的源码, 依葫芦画瓢, 自定义我们想要的任何日历. 下面是 Pandas 的 github 地址, 大家找到如下图的源码, 拷贝一下:
https://github.com/pandas-dev/pandas/blob/master/pandas/tseries/holiday.py

源码的代码很简单, 对假日的定义主要就是体现在 holiday() 函数里. 下面来实践一下, 比如我的生日是4月20日, 我要把这一天自定义到4月的休息日里:

from pandas.tseries.holiday import AbstractHolidayCalendar, nearest_workday, Holiday class myBirthdayCalendar(AbstractHolidayCalendar): rules = [ Holiday('Rachel"s Birthday', month=4, day=20) ] myc = CustomBusinessDay(calendar = myBirthdayCalendar()) pd.date_range(start='4/1/2018', end='4/30/2018', freq=myc) 

输出:

DatetimeIndex(['2018-04-02', '2018-04-03', '2018-04-04', '2018-04-05', '2018-04-06', '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12', '2018-04-13', '2018-04-16', '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-23', '2018-04-24', '2018-04-25', '2018-04-26', '2018-04-27', '2018-04-30'], dtype='datetime64[ns]', freq='C') 

另外, 大家在看 USFederalHolidayCalendar() 的源代码时, 应该已经注意到 holiday() 函数的第三个参数 observance=nearest_workday, 这个参数的意思就是说, 如果刚好节日的那天也是周六的话, 那么就把周五定为休息日, 如果刚好节日的那天也是周日的话, 就把下周一定为休息日, 也就是不能白过节的意思, 哈哈哈. 不知道我表达清楚了没有, 如果还是有点迷糊, 就动手时间一下, 对照日历看下就明白了. 我这里暂且把生日改为4月21日, 刚好那天是周六, 但是我加上这个参数 -- observance=nearest_workday:

from pandas.tseries.holiday import AbstractHolidayCalendar, nearest_workday, Holiday class myBirthdayCalendar(AbstractHolidayCalendar): rules = [ Holiday('Rachel"s Birthday', month=4, day=21, observance=nearest_workday) ] myc = CustomBusinessDay(calendar = myBirthdayCalendar()) pd.date_range(start='4/1/2018', end='4/30/2018', freq=myc) 

输出:

DatetimeIndex(['2018-04-02', '2018-04-03', '2018-04-04', '2018-04-05', '2018-04-06', '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12', '2018-04-13', '2018-04-16', '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-23', '2018-04-24', '2018-04-25', '2018-04-26', '2018-04-27', '2018-04-30'], dtype='datetime64[ns]', freq='C') 

从输出可以看出, 2018-04-20 也被划为休息日了. OK, 继续......

大多数国家的工作日都是从周一到周五, 但是也有不一样的, 比如埃及的工作日就是从周日到周四, 所以, 我们又要自定义了:

b = CustomBusinessDay(weekmask='Sun Mon Tue Wed Thu') pd.date_range(start='4/1/2018', end='4/30/2018', freq=b) 

输出:

DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04','2018-04-05', '2018-04-08', '2018-04-09', '2018-04-10','2018-04-11', '2018-04-12', '2018-04-15', '2018-04-16','2018-04-17', '2018-04-18', '2018-04-19', '2018-04-22','2018-04-23', '2018-04-24', '2018-04-25', '2018-04-26','2018-04-29', '2018-04-30'],dtype='datetime64[ns]', freq='C')

那比方说, 其中的某一天或者几天又是法定节假日呢? 简单:

b = CustomBusinessDay(weekmask='Sun Mon Tue Wed Thu', holidays=['2018-04-15']) pd.date_range(start='4/1/2018', end='4/30/2018', freq=b) 

输出:

DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04', '2018-04-05', '2018-04-08', '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12', '2018-04-16', '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-22', '2018-04-23', '2018-04-24', '2018-04-25', '2018-04-26', '2018-04-29', '2018-04-30'], dtype='datetime64[ns]', freq='C') 

综上, 我们可以看到 Pandas 真的非常强大, 它有各种各样的参数, 通过不同的设置, 取值, 可谓是花样玩转数据分析.

转载于:https://www.cnblogs.com/rachelross/p/10487021.html

Pandas 基础(16) - Holidays相关推荐

  1. pandas object转float_数据分析篇 | Pandas基础用法6【完结篇】

    这是最后一篇,至此Pandas系列终于连载完了,有需要的也可以看看前面6篇,尽请收藏. 数据分析篇 | Pandas 概览 数据分析篇 | Pandas基础用法1数据分析篇 | Pandas基础用法2 ...

  2. pandas 第二章 pandas基础

    第二章 pandas基础 import numpy as np import pandas as pd import xlrd 在开始学习前,请保证pandas的版本号不低于如下所示的版本,否则请务必 ...

  3. Pandas(一)—— Pandas基础

    Python模块 -- Pandas Pandas(一)-- Pandas基础 一.预备知识 1.1 Python基础 1.2 NumPy基础 1.3 练习 1.3.1 利用列表推导式写矩阵乘法 1. ...

  4. Pandas 基础知识

    目录 第二章 pandas基础 一.文件的读取和写入 1. 文件读取 2. 数据写入 二.基本数据结构 1. Series 2. DataFrame 三.常用基本函数 1. 汇总函数 2. 特征统计函 ...

  5. Pandas基础:文件读取与写入、Series和Dataframe、常用基本函数、排序

    文章目录 一.文件读取与写入 1.读取 (a)csv格式 (b)txt格式 (c)xls或xlsx格式 2. 写入 (a)csv格式 (b)xls或xlsx格式 二.基本数据结构 1.Series ( ...

  6. 数据挖掘-3.Pandas基础

    文章目录 Pandas基础 学习目标 1Pandas介绍 学习目标 1 Pandas介绍 2 为什么使用Pandas 3 小结 2 Pandas数据结构 学习目标 1.Series 1.1 Serie ...

  7. Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表

    系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...

  8. 数据分析:numpy和pandas基础操作详解

    数据处理基础 numpy基础 1.numpy创建数组及基础属性 2.数组的特点 3.创建常见数组 4.数组数据类型 5.生成随机数 6.一维数组索引 7.布尔索引 8. 多维数组的索引 9.实际问题 ...

  9. 【pandas】 pandas基础

    pandas基础 文件的读取和写入 文件读取 常用文件形式读取: pd.read_csv(".csv") pd.read_table(".txt") ⭐可以设置 ...

最新文章

  1. Java并发机制的底层实现原理
  2. mysql ignore index_mysql use index、ignore index、force index用法
  3. php 安装rabbitmq拓展_安装 php-rabbit: RabbitMQ 的 PHP 扩展
  4. hashmap(1.8)
  5. 如何下载EP的各个版本?
  6. 图说 mysql 事务隔离级别
  7. 在拦截器里放入参数 controller_程序员云旅游:10分钟带你走完SpringMVC里一次HTTP请求处理之路...
  8. JavaScriptDom操作与高级应用(八)
  9. python替换字符的操作_Python中的字符串替换操作示例
  10. 405 not allowed什么意思_clock是什么意思
  11. 关于DoIP 协议的理解
  12. mac免费CAD模型设计软件FreeCAD怎样设置中文模式
  13. IGS Viewer / IGS 文件查看器
  14. 前端程序员成长的记录及被某IT外包公司套路的经历
  15. InstallShield软件详解
  16. PHP开发api接口安全验证
  17. Proxmox Mail Gateway (PMG) 安装及简单设置
  18. php本地文件包含 截断,php远程文件包含截断问题
  19. java基金管理系统,基于JSP(java)基金管理系统的设计和实现 - 图文
  20. 学习3D建模多久才能工作呢

热门文章

  1. c语言用pow求x的y次幂,使用系统函数pow(x,y)计算x的y次方的值,注意包含头文件math.h...
  2. 从细胞发现到DNA分子结构的发现,人类经历了三百年
  3. SoundPlayer 播放无声音解决方案
  4. tomcat配置-超有效-80岁奶奶用了都说好
  5. 聊聊“元宇宙” —— 设备篇
  6. 求职必备||程序员的优秀简历都是这样来的
  7. NLP机器翻译任务中,如何用Bleu score评价翻译质量(学习心得)
  8. 从计算机科学理论视角看意识
  9. GB2312汉字分区及内码表
  10. opengl碗状_OpenGLES简单入门