[Pandas]时序数据

1.固定时间

1.1时间的表示

from datetime import datetime
#当前时间
datetime.now()

#指定时间
datetime(2022,12,26)
datetime(year = 2019,month = 12,day = 25)

1.2创建时间点

pd.Timestamp是pandas定义时间的主要函数,代替python中的datetime.datetime对象

#使用python的datetime库
#至少需要传入年、月、日
pd.Timestamp('2022-10-29')

#指定时、分、秒
pd.Timestamp(datetime(2020,11,13,15,16,17))

#指定时间字符串
pd.Timestamp('2012-05-01')
pd.Timestamp('2022-12-12T13')#输出  Timestamp('2022-12-12 13:00:00')
#还可以依次定义year,month,day,hour,minute,second,microsecond
pd.Timestamp(year = 2022,month = 10,day = 30,hour = 17, minute = 59)#Timestamp('2022-10-30 17:59:00')
#解析时间戳
pd.Timestamp(1513393355.5,unit = 's') #单位为秒    输出:Timestamp('2017-12-16 03:02:35.500000')
#用tz指定时区,北京时间是:Asia/Shanghai
pd.Timestamp(1513393355.5,unit = 's',tz = 'Asia/Shanghai')#Timestamp('2017-12-16 11:02:35.500000+0800', tz='Asia/Shanghai')


#获取当前时间
pd.Timestamp('today')  #Timestamp('2022-10-29 11:27:03.529548')
pd.Timestamp('now')  #Timestamp('2022-10-29 11:27:03.529548')

#通过当前时间计算出昨天、明天等信息
#昨天
pd.Timestamp('now') - pd.Timedelta(days = 1)  #Timestamp('2022-10-28 11:28:20.628187')
#明天
pd.Timestamp('now') + pd.Timedelta(days = 1)  #Timestamp('2022-10-30 11:28:43.424174')

#当月初,一日
pd.Timestamp('now').replace(day = 1)  #Timestamp('2022-10-01 11:29:31.132332')

#只取日期
pd.Timestamp('now').date().replace(day = 1)  #datetime.date(2022, 10, 1)

#pd.to_datetime()也可以实现上述功能,不过常用在时间转换上
pd.to_datetime('now')  #Timestamp('2022-10-29 03:31:05.711735')

1.3时间的属性

time = pd.Timestamp('now')

time.asm8  #返回numpy datetime64格式(以纳秒为单位)  numpy.datetime64('2022-10-29T11:35:45.920166000')
time.dayofweek   #返回周几。周一为0    out: 5
time.dayofyear  #302 (一年中的第几天)
time.days_in_month  #31  (当月有多少天)
time.freqstr  #周期字符
time.is_leap_year  #False,是否是公历闰年
time.is_month_end  #False(是否是当月最后一天)
time.is_month_start
time.is_quarter_end  #False(是否是当季最后一天)
time.is_quarter_start
time.is_year_end #False (是否是当年最后一天)
time.is_year_start
time.quarter  #4 (返回当前季度数)
time.week #43 当年第几周
time.weekofyear  #43 同上
time.day  #29  ,29号
time.fold

1.4时间的方法

time = pd.Timestamp('now',tz = 'Asia/Shanghai')

#转换为指定时区
time.astimezone('UTC')  #timestamp('2022-10-29 03:48:46.357820+0000', tz='UTC')
time.tz_convert('UTC')

#转换单位,向上舍入
time.ceil('s')   #转换以秒为单位     Timestamp('2022-10-29 11:49:27+0800', tz='Asia/Shanghai')
time.ceil('ns')   #转换以纳秒为单位     Timestamp('2022-10-29 11:50:00.283949+0800', tz='Asia/Shanghai')
time.ceil('d')    #保留日    Timestamp('2022-10-30 00:00:00+0800', tz='Asia/Shanghai')
time.ceil('h')    #保留时    Timestamp('2022-10-29 12:00:00+0800', tz='Asia/Shanghai')

#转换单位,向下舍入
time.floor('h')   #保留时     Timestamp('2022-10-29 11:00:00+0800', tz='Asia/Shanghai')

#类似四舍五入
time.round('h')  #保留时     Timestamp('2022-10-29 12:00:00+0800', tz='Asia/Shanghai')

#返回星期名
time.day_name()

#月份名称
time.month_name()

#将时间戳规范化为午夜,保留时区tz信息
time.normalize()  #  Timestamp('2022-10-29 00:00:00+0800', tz='Asia/Shanghai')

#将时间元素替换datetime.replace
time.replace(year = 2023)  #Timestamp('2023-10-29 11:54:21.996544+0800', tz='Asia/Shanghai')

#月份换为8月
time.replace(month = 8)  #Timestamp('2022-08-29 11:55:21.935710+0800', tz='Asia/Shanghai')

#转换为周期类型,将丢失时区
time.to_period(freq = 'h')  #Period('2022-10-29 11:00', 'H')

#本地化时区转换
time = pd.Timestamp('now')
time.tz_localize('Asia/Shanghai') #Timestamp('2022-10-29 11:58:24.845443+0800', tz='Asia/Shanghai')

#删除时区
time.tz_localize(None)

2.时长数据

2.1创建时间差

#创建时间差
pd.Timestamp('2020-11-01 15')-pd.Timestamp('2020-11-01 14') #Timedelta('0 days 01:00:00')
pd.Timestamp('2020-11-01 15')-pd.Timestamp('2020-11-02 14') #Timedelta('-1 days +01:00:00')
#一天
pd.Timedelta('1 days 2 hours 2min ')  #Timedelta('1 days 02:02:00')
pd.Timedelta(days = 5, minutes = 4, seconds = 10)  #Timedelta('5 days 00:04:10')

#使用带周期量的偏移量别名
#一天
pd.Timedelta('1D')  #Timedelta('1 days 00:00:00')
#两周
pd.Timedelta('2W')  #Timedelta('14 days 00:00:00')
#一天零2小时3分钟4秒
pd.Timedelta('1D2H3M4S')  #Timedelta('1 days 02:03:04')

#带单位的整型数字
#一天
pd.Timedelta(1,unit = 'd')  #Timedelta('1 days 00:00:00')
#100秒
pd.Timedelta(100,unit = 's')  #Timedelta('0 days 00:01:40')
#4周
pd.Timedelta(4,unit = 'w')  #Timedelta('28 days 00:00:00')

#使用python内置的datetime.timedelta或者numpy的np.timedelta64
pd.Timedelta('-1min')   #Timedelta('-1 days +23:59:00')

#使用时间偏移对象DateOffsets(Day,Hour,Minute,Second,Milli,Micro,Nano)直接创建
#两分钟
pd.Timedelta(pd.offsets.Minute(2)) #Timedelta('0 days 00:02:00')
#3天
pd.Timedelta(pd.offsets.Day(3))  #Timedelta('3 days 00:00:00')

pd.to_timedelta(pd.offsets.Day(3)) #同上
pd.to_timedelta('15.5min')  #Timedelta('0 days 00:15:30')

2.2时长的加减

pd.Timedelta(pd.offsets.Day(1))+pd.Timedelta(pd.offsets.Hour(5))  #Timedelta('1 days 05:00:00')
pd.Timedelta(pd.offsets.Day(1))-pd.Timedelta(pd.offsets.Hour(5))  #Timedelta('0 days 19:00:00')

#固定时间与时长相加减会得到一个新的固定时间
pd.Timestamp('2022-10-30') - pd.Timedelta(pd.offsets.Day(1))  #Timestamp('2022-10-29 00:00:00')
pd.Timestamp('now') + pd.Timedelta('3W')   #Timestamp('2022-11-19 13:13:55.203348')

#时长的属性
tdt = pd.Timedelta('10 days 9 min 3 sec')
tdt.days  #10
tdt.seconds  #543
tdt.value   #864543000000000  (时间戳)

3.时间序列

3.1时序索引

DatetimeIndex是时间索引对象,一般由to_datetime()或date_range()来创建

date)range()可以给定开始或结束时间,并给定周期数据、周期频率,会自动生成在此范围内的时间索引数据

in:
#默认频率为天
pd.date_range('2022-01-01',periods = 10)

out:
DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04',
               '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08',
               '2022-01-09', '2022-01-10'],
              dtype='datetime64[ns]', freq='D')

in:
pd.date_range(end = '2022-01-10',periods = 10)  #输出同上
pd.date_range('2020-01-01','2020-01-10')  #输出同上
in:
#pd.bdate_range()生成数据可以跳过周六日,实现工作日的时间索引序列
#频率为工作日
pd.bdate_range('2022-06-04','2022-06-30')

out:
DatetimeIndex(['2022-06-06', '2022-06-07', '2022-06-08', '2022-06-09',
               '2022-06-10', '2022-06-13', '2022-06-14', '2022-06-15',
               '2022-06-16', '2022-06-17', '2022-06-20', '2022-06-21',
               '2022-06-22', '2022-06-23', '2022-06-24', '2022-06-27',
               '2022-06-28', '2022-06-29', '2022-06-30'],
              dtype='datetime64[ns]', freq='B')

3.2创建时序数据

将时序索引序列作为索引或者将时间列转换为时间类型

in:
#生成时序索引
tidx = pd.date_range('20221029',periods = 10)

#应用时序索引
s = pd.Series(range(len(tidx)),index = tidx)
s

out:
2022-10-29    0
2022-10-30    1
2022-10-31    2
2022-11-01    3
2022-11-02    4
2022-11-03    5
2022-11-04    6
2022-11-05    7
2022-11-06    8
2022-11-07    9
Freq: D, dtype: int64

若将其作为Series的内容,可以看到序列的数据类型为datetime64[ns]:

in:
pd.Series(tidx)

out:
0   2022-10-29
1   2022-10-30
2   2022-10-31
3   2022-11-01
4   2022-11-02
5   2022-11-03
6   2022-11-04
7   2022-11-05
8   2022-11-06
9   2022-11-07
dtype: datetime64[ns]

3.3数据访问

查询访问时间序列时,和[]、loc等的用法一样,可以按照切片的操作来对数据进行访问,支持传入时间字符和各种时间对象。也可以使用部分字符查询一定范围内的数据。如果想知道序列的粒度(即频率),可以使用ts.resolution查看

df.truncate()作为一个专门对索引的截取工具,可以很好的应用在时序索引上,给定开始时间和结束时间来截取部分时间

in:
idx = pd.date_range('1/1/2022','12/31/2022')
ts = pd.Series(np.random.randn(len(idx)),index = idx)
ts.truncate(before = '2022-10-01',after = '2022-10-31')

out:
2022-10-01   -0.918724
2022-10-02   -0.914550
2022-10-03    1.473695
2022-10-04   -0.995568
2022-10-05   -0.706117
2022-10-06   -1.426330
2022-10-07    0.031027
2022-10-08   -0.750326
2022-10-09    0.082229
2022-10-10    0.342834
2022-10-11    1.700724
2022-10-12   -0.232330
2022-10-13    0.995066
2022-10-14   -0.447376
2022-10-15   -1.067146
2022-10-16    0.795251
2022-10-17    0.057586
2022-10-18    1.494221
2022-10-19    1.156368
2022-10-20   -0.709864
2022-10-21    1.502966
2022-10-22   -0.029484
2022-10-23   -0.092372
2022-10-24    0.182411
2022-10-25   -0.159909
2022-10-26    0.362496
2022-10-27    0.642464
2022-10-28   -1.892078
2022-10-29    0.361530
2022-10-30    1.529568
2022-10-31    1.016474
Freq: D, dtype: float64

3.4类型转换

由于时间格式样式比较多,很多情况下Pandas并不能自动将时序数据识别为时间类型,所以我们在处理前的数据清洗过程中,需要专门对数据进行时间类型转换

astype是最简单的时间转换方式,它只能针对相对标准的时间格式

in:
s = pd.Series(['2022-10-01','2022-10-02','2022-10-03'])
s

out:
0    2022-10-01
1    2022-10-02
2    2022-10-03
dtype: object

该数据类型是object,从数据内容上看,s是符合时序格式的,但想让他成为时间类型,需要用astype进行转换

in:
#转换为时间类型
s.astype('datetime64')

out:
0   2022-10-01
1   2022-10-02
2   2022-10-03
dtype: datetime64[ns]

默认频率是纳秒ns

in:
#修改频率
s.astype('datetime64[D]')

out:
0   2022-10-01
1   2022-10-02
2   2022-10-03
dtype: datetime64[ns]

pd.to_datetime()也可以转换时间类型

in:
#转为时间类型
pd.to_datetime(s)

out:
0   2022-10-01
1   2022-10-02
2   2022-10-03
dtype: datetime64[ns]

pd.to)datetme()还可以将多列组合成一个时间进行转换

in:
df = pd.DataFrame({'year':[2019,2019,2019],
                  'month':[10,11,12],
                  'day':[10,11,12]})
df
out:

year	month	day
0	2019	10	10
1	2019	11	11
2	2019	12	12

#转为时间类型
in:
pd.to_datetime(df)
pd.to_datetime(df[['year','month','day']])

out:
#两行代码效果相同
0   2019-10-10
1   2019-11-11
2   2019-12-12
dtype: datetime64[ns]

对于Series,pd.to_datetime()会智能识别其时间格式并进行转换

in:
s = pd.Series(['2022-10-01','2022-10-31',None])
pd.to_datetime(s)

out:
0   2022-10-01
1   2022-10-31
2          NaT
dtype: datetime64[ns]

对于列表,pd.to_datetime()也会智能识别其时间格式并转换为时间序列索引

in:
pd.to_datetime(['2019/11/1','2019.12.26'])

out:
DatetimeIndex(['2019-11-01', '2019-12-26'], dtype='datetime64[ns]', freq=None)
in:
pd.to_datetime(['1-10-2019'],dayfirst = True)  #按日期在前进行解析
out:
DatetimeIndex(['2019-10-01'], dtype='datetime64[ns]', freq=None)

用pd.DatetimeIndex直接转为时间序列索引,自动推断频率

in:
pd.DatetimeIndex(['20190901','20190902','20190903'],freq = 'infer')

out:
DatetimeIndex(['2019-09-01', '2019-09-02', '2019-09-03'], dtype='datetime64[ns]', freq='D')

 针对单个时间,用pd.Timestamp()进行转换

pd.Timestamp('2019/11/12')

3.5按格式转换

如果原数据的格式为不规范的时间格式数据,可以通过格式映射来将其转为时间数据

in:
#不规则格式转换时间
pd.to_datetime('2019///12-7825',format = '%Y///%m-78%d',errors = 'ignore')

out:
Timestamp('2019-12-25 00:00:00')
#可以让系统自己推断时间格式
pd.to_datetime('20190106',infer_datetime_format = True,
              errors = 'ignore')  #Timestamp('2019-01-06 00:00:00')

#将errors参数设置为coerce,将不会忽略错误,返回空值
pd.to_datetime('20190911',format = '%T%m%d',errors = 'coerce')  #NaT

#列转为字符串,再转为时间类型
pd.to_datetime(df.astype(str),format = '%m%d%Y')   
'''0   2019-10-10
1   2019-11-11
2   2019-12-12
dtype: datetime64[ns]'''

#其他
pd.to_datetime('2019-12-16',format = '%Y-%m-%d')  #Timestamp('2019-12-16 00:00:00')
pd.to_datetime('01-12-2019 00:00',format = '%d-%m-%Y %H:%M')  #Timestamp('2019-12-01 00:00:00')

#对时间戳进行转换,需要给出时间单位,一般为秒
pd.to_datetime(1650265999,unit = 's')  #Timestamp('2022-04-18 07:13:19')

#可以将数字列表转换为时间
pd.to_datetime([10,11,12,15],unit = 'D',
              origin = pd.Timestamp('2022-10-29'))  #DatetimeIndex(['2022-11-08', '2022-11-09', '2022-11-10', '2022-11-13'], dtype='datetime64[ns]', freq=None)

3.6时间访问器.dt

时间访问器 .dt.,用它可以以time.dt.xxx的形式来访问时间序列数据的属性和调用他们的方法,返回对应值的序列

in:
s = pd.Series(pd.date_range('2019-11-06',periods = 5,freq = 'd'))
#各天是星期几
s.dt.day_name()

out:
0    Wednesday
1     Thursday
2       Friday
3     Saturday
4       Sunday
dtype: object

以下列出时间访问器的一些属性和方法

[Pandas]时序数据_第1张图片

[Pandas]时序数据_第2张图片

[Pandas]时序数据_第3张图片

[Pandas]时序数据_第4张图片

3.7时序数据移动

shift()方法可以在时序对象上实现向上或向下移动

rng = pd.date_range('2019-09-11','2019-12-26')
ts = pd.Series(range(len(rng)),index = rng)

#向上移动一位
ts.shift(-1)
#向下移动一位
ts.shift(1)

#向上移动一个工作日
ts.shift(-1,freq = 'B')

 3.8频率转换

更换时间频率是将时间序列由一个频率更换为另一个频率单位,实现时间粒度的变化。更改频率的主要功能是asfreq()方法

#一个频率为自然日的时间序列
rng = pd.date_range('2019-10-10','2019-12-31')
ts = pd.Series(range(len(rng)),index = rng)

#将它的频率变更为更加细的粒度,会产生缺失值
#频率转为12小时
ts.asfreq(pd.offsets.Hour(12))

#对于缺失值可以用指定值或者指定方法进行填充
#对缺失值进行填充
ts.asfreq(freq = '12h',fill_value = 0)
ts.asfreq(pd.offsets.Hour(12),method = 'pad')

4.时间偏移

DateOffset类似于时长Timedelta,但它使用日历中时间日期的规则,而不是直接进行时间性质的算术计算。

4.1DateOffset对象

所有的日期偏移对象都在pandas.tseries.offsets下,其中pandas.tseries.offsets.DateOffset是标准的日期范围时间偏移类型,它默认是一个日历日

from pandas.tseries.offsets import DateOffset

4.2偏移别名

DateOffset基本都支持频率字符串或偏移别名,传入freq参数,时间偏移的子类、子对象都支持时间偏移的相关操作

[Pandas]时序数据_第5张图片

 4.3移动偏移

ts = pd.Timestamp('2019-12-16')  
ts    #Timestamp('2019-12-16 00:00:00')
ts.day_name()  #'Monday'

#定义一个工作小时偏移,默认是周一到周五9-17点,从10点开始
offset = pd.offsets.BusinessHour(start = '10:00')

#向前偏移一个工作小时
offset.rollforward(ts)

#向前偏移至最近的工作日,小时也会增加
ts+offset   #Timestamp('2019-12-16 11:00:00')
#向后偏移
offset.rollback(ts)  #Timestamp('2019-12-13 17:00:00')

ts-pd.offsets.Day(1)  #昨日
ts-pd.offsets.Day(2)  #前日
ts-pd.offsets.MonthEnd() - pd.offsets.MonthBegin()  #上个月一号
ts-pd.offsets.MonthEnd() #上个月最后一号

时间偏移操作会保留小时和分钟,有时候不在意具体时间,可以使用normalize()进行标准化到午夜0点

offset.rollback(ts).normalize()  #Timestamp('2019-12-13 00:00:00')

4.4应用偏移

apply可以使偏移对象应用到一个时间上

ts = pd.Timestamp('2019-12-26 09:00')
day = pd.offsets.Day()  #定义偏移对象
day.apply(ts)   #Timestamp('2019-12-27 09:00:00')
day.apply(ts).normalize()  #标准化/归一化    out:Timestamp('2019-12-27 00:00:00')

4.5偏移参数

d = datetime.datetime(2019,6,1,9,0)
d  #datetime.datetime(2019, 6, 1, 9, 0)
#偏移一周
d+pd.offsets.Week()    #Timestamp('2019-06-08 09:00:00')

d+pd.offsets.Week(weekday = 4)  #偏移4周中的日期   Timestamp('2019-06-07 09:00:00')

d-pd.offsets.Week()  #向后一周    Timestamp('2019-05-25 09:00:00')

#参数也支持标准化
d + pd.offsets.Week(normalize = True)    #Timestamp('2019-06-08 00:00:00')

#YearEnd支持用参数month指定月份
d+pd.offsets.YearEnd()  #Timestamp('2019-12-31 09:00:00')
d+pd.offsets.YearEnd(month = 6)  #Timestamp('2019-06-30 09:00:00')

4.6相关查询

in:
i = pd.date_range('2019-04-09',periods = 4,freq = '2D')
ts = pd.DataFrame({'A':[1,2,3,4]},index = i)
ts
#取最后三天
#注意,返回的是最近三天的日期,而不是数据集中最近三天的数据,因此并未返回14号的数据
ts.last('3D')

out:
	A
2019-04-09	1
2019-04-11	2
2019-04-13	3
2019-04-15	4



A
2019-04-13	3
2019-04-15	4
in:
#前三天
ts.first('3D')

out:
	A
2019-04-09	1
2019-04-11	2

可以使用at_time()来指定时间:

#指定时间
ts.at_time('12:00')

用between_time()来指定时间区间

ts.between_time('00:15','00:45')

4.7锚定偏移

对于某些频率,可以指定锚定后缀,让它支持在一定的时间开始或结束,比如可以将周频率从默认的周日调到周一,见下表

[Pandas]时序数据_第6张图片

 对于固定在特定频率开始或结束(MonthEnd,MonthBegin,WeekEnd等)的偏移,向前和向后移动的规则是:当n不为0时,如果给定的日期不在锚点上,则它会捕捉到下一个(上一个)锚点,并向前或向后移动|n|-1步

pd.Timestamp('2019-10-12') +pd.offsets.MonthBegin(n=1)   #Timestamp('2019-11-01 00:00:00')

pd.Timestamp('2020-01-02')+pd.offsets.MonthEnd(n=1)    #Timestamp('2020-01-31 00:00:00')

pd.Timestamp('2020-01-02') - pd.offsets.MonthEnd(n=1)  #Timestamp('2019-12-31 00:00:00'

如果给定的日期是锚点,则将其前移或者后移|n|步

pd.Timestamp('2020-01-01') + pd.offsets.MonthBegin(n=1)  #Timestamp('2020-02-01 00:00:00')

4.8自定义工作时间

可以向Cday或CustomBusinessDay类传入节假日参数来自定义一个工作日偏移对象

weekmask_egypt = 'Sun Mon Tue Wed Thu'
#定义出五一劳动节的日期
holidays = ['2018-05-01',datetime.datetime(2019,5,1),np.datetime64('2020-05-01')]

#自定义工作日中传入休假日期,一个正常星期工作日的顺序
bday_egypt = pd.offsets.CustomBusinessDay(holidays = holidays,weekmask = weekmask_egypt)

#指定一个日期
dt = datetime.datetime(2020,4,30)
#偏移两个工作日
dt + 2*bday_egypt   #Timestamp('2020-05-04 00:00:00')

BusinessHour 表示开始和结束工作的小时时间,默认9-17点,与时间相加超过一个小时会移到下一个小时,超过一天会移动到下一个工作日

可以自定义开始和结束工作的时间,格式必须是hour:minute字符串,不支持秒、微秒、纳秒

#11点开始上班
bh = pd.offsets.BusinessHour(start = '11:00',end = datetime.time(20,0))
bh  #
pd.Timestamp('2022-10-29 19:00')+bh  #Timestamp('2022-10-31 12:00:00')
pd.Timestamp('2022-10-29 09:00') + bh  #Timestamp('2022-10-31 12:00:00')
pd.Timestamp('2022-10-28 09:00') + bh  #Timestamp('2022-10-28 12:00:00')

#start时间晚于end时间表示夜班工作时间,此时工作时间将从午夜延至第二天

5.时间段

Pandas中的Period()对象表示一个时间段,比如一年、一个月或者一个季度。它与时间长度不同,表示一个具体的时间区间,有时间起点和周期频率

5.1Period对象

#创建一个时间段(年)
pd.Period('2020')  #Period('2020', 'A-DEC')

#创建一个时间段(季度)
pd.Period('2022Q4')   #Period('2022Q4', 'Q-DEC')

这两个返回的时间段对象里,A代表annual,Q代表季度,DEC代表12月(December)。         

A-DEC:这个时间段对象代表一个在2020年结束于12月的全年时间段

#2022-01-01 全天的时间段
pd.Period(year = 2022, freq = 'D')  #Period('2022-01-01', 'D')

#一周
pd.Period('20221029',freq = 'W')  #Period('2022-10-24/2022-10-30', 'W-SUN')

#指定周期
pd.Period('2022-10-29','D')  #Period('2022-10-29', 'D')

5.2属性方法

p = pd.Period('2022Q4')

#开始与结束时间
p.start_time  #Timestamp('2022-10-01 00:00:00')

p.end_time  #Timestamp('2022-12-31 23:59:59.999999999')

#转换频率
p.asfreq('D')  #将频率转换为天   Period('2022-12-31', 'D')
p.asfreq('D',how = 'start')  #以起始时间为准   Period('2022-10-01', 'D')

[Pandas]时序数据_第7张图片

 [Pandas]时序数据_第8张图片

 对时间段做加减法,表示将此时间段前移或后移相应的单位

pd.Period('2022Q4') + 1  #Period('2023Q1', 'Q-DEC')

时间段对象也可以跟时间偏移对象做加减,也可以跟时间差加减

类似于pd.date_range()生成时序索引数据,pd.period_range()可以生成时间段索引数据

in:
pd.period_range('2022-10-01',freq = 'D',periods = 10)
out:
PeriodIndex(['2022-10-01', '2022-10-02', '2022-10-03', '2022-10-04',
             '2022-10-05', '2022-10-06', '2022-10-07', '2022-10-08',
             '2022-10-09', '2022-10-10'],
            dtype='period[D]')
in:
#指定开始与结束时间
pd.period_range('2022Q1','2022Q4',freq = 'Q-NOV')

out:
PeriodIndex(['2022Q1', '2022Q2', '2022Q3', '2022Q4'], dtype='period[Q-NOV]')

时间段索引可以应用于数据中

在数据查询时,支持切片操作

也可以使用astype()实现在几种数据之间自由转换,如DatetimaIndex和PeriodIndex

PeriodIndex转换频率:频率从月转为季度:

ts.astype('period[Q]')

6.时间操作

6.1时区转换

如果没有指定,时间一般不带时区。

北京时区使用'Asia/Shanghai'来定义

从一个时区转换为另一个时区,使用tz_convert方法

6.2时间的格式化

在数据格式解析、输出格式和格式转换过程中,需要使用标识符来匹配日期元素的位置,Pandas使用Python的格式化符合系统

#解析时间格式
pd.to_datetime('2022*11*12',format = '%Y*%m*%d')  #Timestamp('2022-11-12 00:00:00')

#输出的时间格式
pd.Timestamp('now').strftime('%Y年%m月%d日')  #'2022年10月29日'

日期和时间的格式化符号

[Pandas]时序数据_第9张图片

 6.3时间重采样

Pandas可以对时序数据按不同的频率进行重采样操作,例如原时序数据频率为分钟,使用resample()可以按5分钟,15分钟,半小时等频率进行分组,然后完成聚合计算

idx = pd.date_range('2022-01-01',periods = 500,freq = 'Min')
ts = pd.Series(range(len(idx)),index = idx)
#ts

#每五分钟进行一次聚合
ts.resample('5Min').sum()
#重采样功能灵活,除了sum,还有mean,std,sem,max等

其中onlc又叫美国线(open - high - low - close chart),可以呈现类似股票的开盘价、最高价、最低价、收盘价

in:
ts.resample('2h').ohlc()

out:
	open	high	low	close
2022-01-01 00:00:00	0	119	0	119
2022-01-01 02:00:00	120	239	120	239
2022-01-01 04:00:00	240	359	240	359
2022-01-01 06:00:00	360	479	360	479
2022-01-01 08:00:00	480	499	480	499

可以将closed参数设置为‘left’或'right',以指定开闭区间的哪一端

在重采样过程中,同样可以使=使用.ffill()和.bfill()来计算填充值

你可能感兴趣的:(pandas,python)