from datetime import datetime
#当前时间
datetime.now()
#指定时间
datetime(2022,12,26)
datetime(year = 2019,month = 12,day = 25)
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')
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
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)
#创建时间差
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')
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 (时间戳)
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')
将时序索引序列作为索引或者将时间列转换为时间类型
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]
查询访问时间序列时,和[]、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
由于时间格式样式比较多,很多情况下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')
如果原数据的格式为不规范的时间格式数据,可以通过格式映射来将其转为时间数据
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)
时间访问器 .dt.
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
以下列出时间访问器的一些属性和方法
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')
更换时间频率是将时间序列由一个频率更换为另一个频率单位,实现时间粒度的变化。更改频率的主要功能是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')
DateOffset类似于时长Timedelta,但它使用日历中时间日期的规则,而不是直接进行时间性质的算术计算。
所有的日期偏移对象都在pandas.tseries.offsets下,其中pandas.tseries.offsets.DateOffset是标准的日期范围时间偏移类型,它默认是一个日历日
from pandas.tseries.offsets import DateOffset
DateOffset基本都支持频率字符串或偏移别名,传入freq参数,时间偏移的子类、子对象都支持时间偏移的相关操作
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')
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')
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')
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')
对于某些频率,可以指定锚定后缀,让它支持在一定的时间开始或结束,比如可以将周频率从默认的周日调到周一,见下表
对于固定在特定频率开始或结束(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')
可以向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时间表示夜班工作时间,此时工作时间将从午夜延至第二天
Pandas中的Period()对象表示一个时间段,比如一年、一个月或者一个季度。它与时间长度不同,表示一个具体的时间区间,有时间起点和周期频率
#创建一个时间段(年)
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')
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')
对时间段做加减法,表示将此时间段前移或后移相应的单位
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]')
如果没有指定,时间一般不带时区。
北京时区使用'Asia/Shanghai'来定义
从一个时区转换为另一个时区,使用tz_convert方法
在数据格式解析、输出格式和格式转换过程中,需要使用标识符来匹配日期元素的位置,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可以对时序数据按不同的频率进行重采样操作,例如原时序数据频率为分钟,使用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()来计算填充值