进行date的偏移
1 各种offset
1.1 DateOffset
1.1.1 基本使用方法
class pandas.tseries.offsets.DateOffset
n | 偏移量表示的时间段数。 如果没有指定时间模式,则默认为n天。 |
normalize | 是否将DateOffset偏移的结果向下舍入到前一天午夜 |
**kwds | 添加到偏移量的时间参数
【指的是在原来的timestamp的基础上,加上这个时间偏移量】 替换偏移量值的参数:
【指将原来timestamp的相应时间参数,替换成这个时间偏移量】 |
1.1.2 举例说明
from pandas.tseries.offsets import DateOffset
import pandas as pd
ts=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/6
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.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_endis_month_start | (感觉和offsets里面的内容无关?)判断timestamp是否在一个月的最后一天/第一天 |
is_quater_endis_quater_start | (感觉和offsets里面的内容无关?)判断timestamp是否在一个季度的最后一天/第一天
|
is_year_endis_year_start | (感觉和offsets里面的内容无关?)判断timestamp是否在一个年的最后一天/第一天 |
参考内容:Date offsets — pandas 2.0.0 documentation (pydata.org)