python数据科学(十一):pandas基础

您所在的位置:网站首页 python数据上采样 python数据科学(十一):pandas基础

python数据科学(十一):pandas基础

2023-09-03 22:04| 来源: 网络整理| 查看: 265

数据科学(十一) 时间日期时间差字符串和 datetime 转换Pandas 里的时间序列生成日期范围规则化时间戳星期月每个月最后一个工作日组成的索引小时 时期及算术运算时期序列直接用字符串时期的频率转换以年为周期,以一年中的 3 月份作为年的结束(财年)季度时间频率Timestamp 和 Period 相互转换 代码 重采样 resample重采样方式OHLC 重采样通过groupby重采样 升采样时期重采样代码

时间日期 时间戳 tiimestamp:固定的时刻 -> pd.Timestamp固定时期 period:比如 2016年3月份,再如2015年销售额 -> pd.Period时间间隔 interval:由起始时间和结束时间来表示,固定时期是时间间隔的一个特殊

时间日期在 Pandas 里的作用

分析金融数据,如股票交易数据分析服务器日志

python 标准库里提供了时间日期的处理。这个是时间日期的基础。

时间差

两个datetime相减

字符串和 datetime 转换

date = datetime(2016, 3, 20, 8, 30) date.strftime(’%Y-%m-%d %H:%M:%S’) datetime.strptime(‘2016-03-20 09:30’, ‘%Y-%m-%d %H:%M’)

Pandas 里的时间序列

Pandas 里使用 Timestamp 来表达时间

生成日期范围

pd.date_range(‘起始日期’, ‘终止日期’) pd.date_range(start=‘起始日期’, periods=10)

规则化时间戳

pd.date_range(start=‘起始日期’, periods=10, freq=‘选时间’)

星期

freq=‘W’

freq=‘M’

每个月最后一个工作日组成的索引

freq=‘BM’

小时

freq=‘4H’

时期及算术运算

pd.Period 表示时期,比如几日,月或几个月等。比如用来统计每个月的销售额,就可以用时期作为单位。

时期序列 直接用字符串

pd.period()

时期的频率转换

freq

A-DEC: 以 12 月份作为结束的年时期A-NOV: 以 11 月份作为结束的年时期Q-DEC: 以 12 月份作为结束的季度时期 以年为周期,以一年中的 3 月份作为年的结束(财年)

p.asfreq(‘A-MAR’)

季度时间频率

Pandas 支持 12 种季度型频率,从 Q-JAN 到 Q-DEC

Timestamp 和 Period 相互转换

.to_period()

代码 import pandas as pd import numpy as np from datetime import datetime from datetime import timedelta #时间日期 now = datetime.now() print(now) print(now.year, now.month, now.day) ### 时间差 print('时间差') date1 = datetime(2016, 3, 20) date2 = datetime(2016, 3, 16) delta = date1 - date2 print(delta) print(delta.days) print(delta.total_seconds()) print(date2 + delta) print(date2 + timedelta(4.5)) ## 字符串和 datetime 转换 #关于 datetime 格式定义,可以参阅 python 官方文档 print('字符串和 datetime 转换') date = datetime(2016, 3, 20, 8, 30) print(date) print(str(date)) print(date.strftime('%Y-%m-%d %H:%M:%S')) print(datetime.strptime('2016-03-20 09:30', '%Y-%m-%d %H:%M')) ## Pandas 里的时间序列 #Pandas 里使用 Timestamp 来表达时间 print('Pandas 里的时间序列') dates = [datetime(2016, 3, 1), datetime(2016, 3, 2), datetime(2016, 3, 3), datetime(2016, 3, 4)] s = pd.Series(np.random.randn(4), index=dates) print(s) print(type(s.index)) print(type(s.index[0])) ## 日期范围 ### 生成日期范围 print('日期范围') range1=pd.date_range('20160320', '20160331') range2=pd.date_range(start='20160320', periods=10) print(range1) print(range2) ## 规则化时间戳 print('规则化时间戳') timetime=pd.date_range(start='2016-03-20 16:23:32', periods=10, normalize=True) print(timetime) ### 星期 timetime=pd.date_range(start='20160320', periods=10, freq='W') print('星期{}'.format(timetime)) ### 月 pd.date_range(start='20160320', periods=10, freq='M') print('月{}'.format(timetime)) ### 每个月最后一个工作日组成的索引 pd.date_range(start='20160320', periods=10, freq='BM') print('最后工作日{}'.format(timetime)) ### 小时 pd.date_range(start='20160320', periods=10, freq='4H') print('小时{}'.format(timetime)) ## 时期及算术运算 #pd.Period 表示时期,比如几日,月或几个月等。比如用来统计每个月的销售额,就可以用时期作为单位。 print('时期及算术运算') p1 = pd.Period(2010) print(p1) p2 = p1 + 2 print(p2) print(p2 - p1) p1 = pd.Period(2016, freq='M') print(p1) print(p1 + 3) ## 时期序列 print('时期序列') xulie=pd.period_range(start='2016-01', periods=12, freq='M') print(xulie) pd.period_range(start='2016-01', end='2016-10', freq='M') print(xulie) ## 直接用字符串 print('直接用字符串') index = pd.PeriodIndex(['2016Q1', '2016Q2', '2016Q3'], freq='Q-DEC') print(index) ## 时期的频率转换 print('时期的频率转换') p = pd.Period('2016', freq='A-DEC') print(p) print(p.asfreq('M', how='start')) print(p.asfreq('M', how='end')) p = pd.Period('2016-04', freq='M') print(p) print(p.asfreq('A-DEC')) ### 以年为周期,以一年中的 3 月份作为年的结束(财年) print(p.asfreq('A-MAR')) ### 季度时间频率 #Pandas 支持 12 种季度型频率,从 Q-JAN 到 Q-DEC p = pd.Period('2016Q4', 'Q-JAN') print(p) # 以 1 月份结束的财年中,2016Q4 的时期是指 2015-11-1 到 2016-1-31 year=p.asfreq('D', how='start'), p.asfreq('D', how='end') print(year) # 获取该季度倒数第二个工作日下午4点的时间戳 p4pm = (p.asfreq('B', how='end') - 1).asfreq('T', 'start') + 16 * 60 print(p4pm) # 转换为 timestamp print(p4pm.to_timestamp()) ### Timestamp 和 Period 相互转换 print(' Timestamp 和 Period 相互转换') ts = pd.Series(np.random.randn(5), index = pd.date_range('2016-01-01', periods=5, freq='M')) print(ts) print(ts.to_period()) ts = pd.Series(np.random.randn(5), index = pd.date_range('2016-12-29', periods=5, freq='D')) print(ts) pts = ts.to_period(freq='M') print(pts) print(pts.groupby(level=0).sum()) # 转换为时间戳时,细部时间会丢失 print(pts.to_timestamp(how='end'))

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

重采样 resample 高频率 -> 低频率 —— 降采样:例:5 分钟股票交易数据转换为日交易数据低频率 -> 高频率 —— 升采样其他重采样:每周三 (W-WED) 转换为每周五 (W-FRI) 重采样方式 OHLC 重采样

ts.resample(‘时间’).ohlc()

通过groupby重采样

ts.index.to_period(‘M’)).sum()

升采样

fill_method=‘ffill’ 向前插值 limit最多插三个

时期重采样

‘A-DEC’:annual以年为单位,DEC结尾是十二月 ‘Q-DEC’:季度为采样

代码 from datetime import datetime from datetime import timedelta import pandas as pd import numpy as np ts = pd.Series(np.random.randint(0, 50, 60), index=pd.date_range('2020-02-16 09:30', periods=60, freq='T')) print(ts) # 每五分钟 # 0-4 分钟为第一组 print('每五分钟') sumsum=ts.resample('5min').sum() print(sumsum) # 0-4 分钟为第一组 sumsum=ts.resample('5min', label='right').sum() print(sumsum) ### OHLC 重采样 print('OHLC 重采样') ohlc=ts.resample('5min').ohlc() print(ohlc) ### 通过 groupby 重采样 print('通过 groupby 重采样') ts = pd.Series(np.random.randint(0, 50, 100), index=pd.date_range('2016-03-01', periods=100, freq='D')) print(ts) print(ts.groupby(lambda x: x.month).sum()) print(ts.groupby(ts.index.to_period('M')).sum()) ### 升采样和插值 print('升采样和插值') # 以周为单位,每周五采样 df = pd.DataFrame(np.random.randint(1, 50, 2), index=pd.date_range('2016-04-22', periods=2, freq='W-FRI')) print(df) sheng=df.resample('D') print(sheng) sheng=df.resample('D', fill_method='ffill', limit=3) print(sheng) # 以周为单位,每周一采样 print(df.resample('W-MON', fill_method='ffill')) ### 时期重采样 df = pd.DataFrame(np.random.randint(2, 30, (24, 4)), index=pd.period_range('2015-01', '2016-12', freq='M'), columns=list('ABCD')) print(df) adf = df.resample('A-DEC').mean() print(adf) re=df.resample('A-MAY').mean() print(re) # 升采样 sheng=adf.resample('Q-DEC') print(sheng) sheng=adf.resample('Q-DEC', fill_method='ffill') print(sheng) ### 性能 n = 1000000 ts = pd.Series(np.random.randn(n), index=pd.date_range('2000-01-01', periods=n, freq='10ms')) print(len(ts)) print(ts.resample('10min').ohlc()) print(ts.resample('D').ohlc()) ## 从文件中读取日期序列 df = pd.read_csv('data/002001.csv', index_col='Date') print(df) print(df.index) df = pd.read_csv('data/002001.csv', index_col='Date', parse_dates=True) print(df.index) wdf = df['Adj Close'].resample('W-FRI').ohlc() print(wdf) wdf['Volume'] = df['Volume'].resample('W-FRI').sum() print(wdf) ### 自定义时间日期解析函数 def date_parser(s): s = '2016/' + s d = datetime.strptime(s, '%Y/%m/%d') return d df = pd.read_csv('data/custom_date.csv', parse_dates=True, index_col='Date', date_parser=date_parser) print(df) print(df.index)

在这里插入图片描述 每五分钟采样

在这里插入图片描述 重采样方式

在这里插入图片描述 在这里插入图片描述 升采样 在这里插入图片描述 时期重采样 在这里插入图片描述 在这里插入图片描述 性能 在这里插入图片描述 读取

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3