> 文章列表 > pandas笔记:tseries.offset

pandas笔记:tseries.offset

pandas笔记:tseries.offset

进行date的偏移

1 各种offset 

1.1 DateOffset

  1.1.1 基本使用方法

class pandas.tseries.offsets.DateOffset
n

偏移量表示的时间段数。

如果没有指定时间模式,则默认为n天。

normalize 是否将DateOffset偏移的结果向下舍入到前一天午夜
**kwds

添加到偏移量的时间参数

  • 年(years)
  • 月(months)
  • 周(weeks)
  • 日(days)
  • 小时(hours)
  • 分钟(minutes)
  • 秒(seconds)
  • 毫秒(milliseconds)
  • 微秒(microseconds)
  • 纳秒(nanoseconds)

【指的是在原来的timestamp的基础上,加上这个时间偏移量】

替换偏移量值的参数:

  • 年(year)
  • 月(month)
  • 日(day)
  • 工作日(weekday)
  • 小时(hour)
  • 分钟(minute)
  • 秒(second)
  • 微秒(microsecond)
  • 纳秒(nanosecond)

【指将原来timestamp的相应时间参数,替换成这个时间偏移量】

1.1.2 举例说明

from pandas.tseries.offsets import DateOffset
import pandas as pdts=pd.Timestamp('2023-04-29 15:03:31')
ts+DateOffset(month=3),ts+DateOffset(months=3)
#(Timestamp('2023-03-29 15:03:31'), Timestamp('2023-07-29 15:03:31'))

1.2  BusinessDay

几个工作日的日期偏移

class pandas.tseries.offsets.BusinessDay

 1.2.1 主要参数

n 默认为1.,偏移的工作日的天数
normalize

默认为False

如果为True,将起止时间规范化到午夜0点

1.2.2  举例说明

import pandas as pd
t1=pd.Timestamp('2023-04-28 10:00')
t1.strftime('%Y%m%d-%A--%H:%M')
#'20230428-Friday--10:00'td=pd.tseries.offsets.BusinessDay(2)
(t1+td).strftime('%Y%m%d-%A-%H:%M')
#'20230502-Tuesday-10:00'td=pd.tseries.offsets.BusinessDay(2,normalize=True)
(t1+td).strftime('%Y%m%d-%A-%H:%M')
'20230502-Tuesday-00:00'
  •  不管t1是几点,都算那一天
  • 工作日就是周一至周五,不考虑节假日

1.3 BusinessHour

class pandas.tseries.offsets.BusinessHour

1.3.1 主要参数

n 默认为1,表示偏移几个小时
normalize

默认为False

如果为True,将起止时间规范化到午夜0点

start time或者time的lilst,表示一天的上班时间
end time或者time的lilst,表示一天的下班时间

 1.3.2 举例

import pandas as pd
t1=pd.Timestamp('2023-04-28 8:00')
t1+pd.tseries.offsets.BusinessHour(n=5)
#Timestamp('2023-04-28 14:00:00')t1+pd.tseries.offsets.BusinessHour(n=10)
#Timestamp('2023-05-01 11:00:00')
#当天工作到17:00,还剩2小时,第2天继续干t1=pd.Timestamp('2023-04-28 18:00')
t1+pd.tseries.offsets.BusinessHour(n=5)
#Timestamp('2023-05-01 14:00:00')
#当天已经过了工作时间(17:00),同时第二天是周末,所以直接挪到周一9:00开始计时
t1=pd.Timestamp('2023-04-28 18:00')
t1+pd.tseries.offsets.BusinessHour(n=5,start='12:00',end='14:00')
#Timestamp('2023-05-03 13:00:00')
#跳过周末+每天只上2小时班t1=pd.Timestamp('2023-04-28 18:00')
t1+pd.tseries.offsets.BusinessHour(n=5,start=['6:00','12:00'],end=['9:00','14:00'])
#Timestamp('2023-05-02 06:00:00')
#每天两段工作时间

 1.4 CustomBusinessDay

手动选择哪些是节假日,哪些天是工作日

1.4.1 主要参数

n 默认为1,表示偏移几个小时
normalize

默认为False

如果为True,将起止时间规范化到午夜0点

weekmask

字符串,默认是‘Mon Tue Wed Thu Fri’

记录了哪些是有效的工作日

holidays 记录了哪些是节假日

1.4.2 使用举例 

import pandas as pd
t1=pd.Timestamp('2023-04-28 8:00')
t1.strftime('%Y%m%d--%A')
#'20230428--Friday't2=t1+pd.tseries.offsets.CustomBusinessDay(2,weekmask='Tue Wed Thu')
t2.strftime('%Y%m%d--%A')
#'20230503--Wednesday'
# 周一不上班,所以两天工作日是周二和周三

 

t3=t1+pd.tseries.offsets.CustomBusinessDay(2,weekmask='Tue Wed Thu',holidays=['2023-05-03','2023-05-04'])
t3.strftime('%Y%m%d--%A')
#'20230509--Tuesday'
#0503,0504放假不上班——这两天不能考虑

1.5  CustomBusinessHour

参数都是CustomBusinessDay和BusinessHour里面的

n 默认为1,表示偏移几个小时
normalize

默认为False

如果为True,将起止时间规范化到午夜0点

weekmask

字符串,默认是‘Mon Tue Wed Thu Fri’

记录了哪些是有效的工作日

holidays 记录了哪些是节假日
start time或者time的lilst,表示一天的上班时间
end time或者time的lilst,表示一天的下班时间

1.6 MonthEnd

到下一个月末(下一个是指,比如1/31加MonthEnd,得到的结果是2月的最后一天)

import pandas as pd
t1=pd.Timestamp('2023-04-28 8:00')
t1+pd.tseries.offsets.MonthEnd()
#Timestamp('2023-04-30 08:00:00')import pandas as pd
t1=pd.Timestamp('2023-04-30 8:00')
t1+pd.tseries.offsets.MonthEnd()
#Timestamp('2023-05-31 08:00:00')

如果在月末最后一天也希望得到当前月份的MonthEnd,需要使用rollforward函数(同时也不是加上OffSet)

import pandas as pd
t1=pd.Timestamp('2023-04-30 8:00')
pd.tseries.offsets.MonthEnd().rollforward(t1)
#Timestamp('2023-04-30 08:00:00')

1.7 MonthBegin

 到下一个月初(下一个是指,比如1/31加MonthBegin,得到的结果是2月的第一天)

import pandas as pd
t1=pd.Timestamp('2023-04-1 8:00')
t1+pd.tseries.offsets.MonthBegin()
#Timestamp('2023-05-01 08:00:00')

如果希望得到当前月份的MonthBegin,需要使用rollback函数(同时也不是加上OffSet)

import pandas as pd
t1=pd.Timestamp('2023-04-30 8:00')
pd.tseries.offsets.MonthBegin().rollback(t1)
#Timestamp('2023-04-01 08:00:00')

1.8 BusinessMonthEnd

用法和MonthEnd(1.6节类似),只不过这里不是月的最后一天,而是月的最后一个工作日

1.9 BusinessMonthBegin

用法和MonthBegin(1.6节类似),只不过这里不是月的第一天,而是月的第一个工作日

1.10 CustomBusinessMonthEnd

1.4和1.8的结合,人为指定工作日和holiday

1.11 CustomBusinessMonthEnd

1.4和1.9的结合,人为指定工作日和holiday

1.12  SemiMonthEnd

每个月的offset结果有两种可能性:

  • 大于等于 day_of_month——>偏移到月底
  • 小于day_of_month——>偏移到该月的day_of_month

1.12.1 主要参数

n 默认为1,表示偏移几个小时
normalize

默认为False

如果为True,将起止时间规范化到午夜0点

day_of_month int, {1, 3,…,27}, default 15

1.12.2 举例

import pandas as pd
t1=pd.Timestamp('2023-04-1 8:00')
t1+pd.tseries.offsets.SemiMonthEnd()
#Timestamp('2023-04-15 08:00:00')import pandas as pd
t1=pd.Timestamp('2023-04-15 8:00')
t1+pd.tseries.offsets.SemiMonthEnd()
#Timestamp('2023-04-30 08:00:00')#同样地,rollforward也是适用的
import pandas as pd
t1=pd.Timestamp('2023-04-15 8:00')
pd.tseries.offsets.SemiMonthEnd().rollforward(t1)
#Timestamp('2023-04-15 08:00:00')

 1.13 SemiMonthBegin

每个月的offset结果有两种可能性:

  • 大于等于 day_of_month——>偏移到下个月月初
  • 小于day_of_month——>偏移到该月的day_of_month

1.13.1 主要参数

n 默认为1,表示偏移几个半月
normalize

默认为False

如果为True,将起止时间规范化到午夜0点

day_of_month int, {1, 3,…,27}, default 15

1.13.2 举例 

import pandas as pd
t1=pd.Timestamp('2023-04-1 8:00')
t1+pd.tseries.offsets.SemiMonthBegin(),t1+pd.tseries.offsets.SemiMonthEnd()
#(Timestamp('2023-04-15 08:00:00'), Timestamp('2023-04-15 08:00:00'))import pandas as pd
t1=pd.Timestamp('2023-04-15 8:00')
t1+pd.tseries.offsets.SemiMonthBegin(),t1+pd.tseries.offsets.SemiMonthEnd()
#(Timestamp('2023-05-01 08:00:00'), Timestamp('2023-04-30 08:00:00'))

 1.14 Week

class pandas.tseries.offsets.Week

 如果没有指定weekday的话,就是偏移到n周之后;如果指定了weekday的话,就是之后的第n个对应的weekday

1.14.1 主要参数

n 偏移几周
weekday 如果指定,就是偏移到周几(0~6,分别表示周一~周日)

1.14.2 举例

import pandas as pd
t1=pd.Timestamp('2023-04-1 8:00')
t1.strftime('%Y%m%d--%A')
#'20230401--Saturday't2=t1+pd.tseries.offsets.Week(1)
t2.strftime('%Y%m%d--%A')
#'20230408--Saturday't2=t1+pd.tseries.offsets.Week(1,weekday=5)
t2.strftime('%Y%m%d--%A')
#'20230408--Saturday'
#下一个周六t2=t1+pd.tseries.offsets.Week(1,weekday=2)
t2.strftime('%Y%m%d--%A')
#'20230405--Wednesday'
#下一个周三

1.15 WeekOfMonth

描述如下的日期:每个月的第x周的周几

1.15.1 主要参数

n

偏移量

week

int {0, 1, 2, 3, …}, default 0

这个月的第几周 默认是0(第一周)

weekday

int {0, 1, …, 6}, default 0

偏移到周几(0~6,分别表示周一~周日)

注:完整的周是从周一开始的 

以2023年3月为例,第0周是3/6这一周 

1.15.2 举例

import pandas as pd
t1=pd.Timestamp('2023-03-3 8:00')
t1.strftime('%Y%m%d--%A')
#'20230303--Friday't2=t1+pd.tseries.offsets.WeekOfMonth()
t2.strftime('%Y%m%d--%A')
#'20230306--Monday'#3月3号算两月份,3月的第一周是3/6import pandas as pd
t1=pd.Timestamp('2023-03-8 8:00')
t1.strftime('%Y%m%d--%A')
#'20230308--Wednesday't2=t1+pd.tseries.offsets.WeekOfMonth()
t2.strftime('%Y%m%d--%A')
#'20230403--Monday'#3月8号算3月份,所以偏移是偏移到4月份

1.16 LastWeekOfMonth

每个月最后一周的周几

1.16.1 主要参数

n

偏移量

weekday

int {0, 1, …, 6}, default 0

偏移到周几(0~6,分别表示周一~周日)

同1.15,完整的周是从周一开始的 

以2023年3月为例,最后一周是3/27,3/27之后的

 

1.16.2 举例

import pandas as pd
t1=pd.Timestamp('2023-03-8 8:00')
t1.strftime('%Y%m%d--%A'
#'20230308--Wednesday't2=t1+pd.tseries.offsets.LastWeekOfMonth()
t2.strftime('%Y%m%d--%A')
#'20230327--Monday'
import pandas as pd
t1=pd.Timestamp('2023-03-28 8:00')
t1.strftime('%Y%m%d--%A')
#'20230328--Tuesday't2=t1+pd.tseries.offsets.LastWeekOfMonth()
t2.strftime('%Y%m%d--%A')
#'20230424--Monday'#三月最后一周,向后偏移,就到4月去了

1.17 BYearEnd

年的最后一个工作日

1.17.1 举例

import pandas as pd
t1=pd.Timestamp('2023-03-28 8:00')
t1.strftime('%Y%m%d--%A')
#'20230328--Tuesday't2=t1+pd.tseries.offsets.BYearEnd(2)
t2.strftime('%Y%m%d--%A')
#'20241231--Tuesday't2=t1-pd.tseries.offsets.BYearEnd(6)
t2.strftime('%Y%m%d--%A')
#'20171229--Friday'

1.18 BYearBegin

年的第一个工作日

1.18.1 举例

import pandas as pd
t1=pd.Timestamp('2023-03-28 8:00')
t1.strftime('%Y%m%d--%A')
#'20230328--Tuesday't2=t1+pd.tseries.offsets.BYearBegin(2)
t2.strftime('%Y%m%d--%A')
#'20250101--Wednesday't2=t1-pd.tseries.offsets.BYearBegin()
t2.strftime('%Y%m%d--%A')
#'20230102--Monday'

1.19 YearEnd

年的最后一天

1.20 YearBegin

年的第一天

1.21 Easter

第n个复活节

import pandas as pd
t1=pd.Timestamp('2023-03-28 8:00')
t1.strftime('%Y%m%d--%A')
#'20230328--Tuesday't2=t1+pd.tseries.offsets.Easter(2)
t2.strftime('%Y%m%d--%A')
#'20240331--Sunday'

2 主要attribute

freqstr

返回一个string,表示频率

kwds

返回类的kwds

copy

复制Offset

is_month_end

is_month_start

(感觉和offsets里面的内容无关?)判断timestamp是否在一个月的最后一天/第一天

is_quater_end

is_quater_start

(感觉和offsets里面的内容无关?)判断timestamp是否在一个季度的最后一天/第一天

 

is_year_end

is_year_start

(感觉和offsets里面的内容无关?)判断timestamp是否在一个年的最后一天/第一天

参考内容:Date offsets — pandas 2.0.0 documentation (pydata.org)