参考资料:活用pandas库
# 导入pandas库
import pandas as pd
# 加载数据集
tesla=pd.read_csv(r"...\data\tesla_stock_yahoo.csv")
# 查看数据
print(tesla.head())
1、基于日期取数据子集
# 将Date数据列转换为datetime类型
tesla['Date']=pd.to_datetime(tesla['Date'])
# 查看2010年6月的数据
tesla[(tesla.Date.dt.year==2010) & (tesla.Date.dt.month==6)]
(1)DatetimeIndex对象
在处理包含datetime的数据时,经常需要datetime对象设置成DataFrame的索引。把索引设置为日期对象之后,就可以直接使用日期来获取某些数据行了,如根据年份来获取部分数据,也可以根据年份和月份来获取数据。
# 将Date设置为索引
tesla.index=tesla['Date']
# 展示索引
print(tesla.index)
# 获取2015年的数据
print(tesla['2015'].iloc[:5,:5])
# 获取2015年6月的数据
print(tesla['2015-06'].iloc[:5,:5])
(2)TimedeltaIndex对象
# 创建一个timedelta
tesla['ref_date']=tesla['Date']-tesla['Date'].min()
# 将此timedelta设置为索引
tesla.index=tesla['ref_date']
# 数据展示
print(tesla.iloc[:5,:5])
# 筛选数据
print(tesla.loc['0 day':'5 day'].iloc[:5,:5])
2、日期范围
并非每个数据集的值都有固定的频率,可以通过date_range函数来创建一个日期范围来为数据集重建索引。
# 读取数据集
ebola=pd.read_csv(r"...\data\country_timeseries.csv",parse_dates=[0])
# 展示数据
print(ebola.iloc[:5,:5])
# 指定日期范围
head_range=pd.date_range(start='2014-12-31',end='2015-01-05')
print(head_range)
ebola5=ebola.head()
ebola5.index=ebola5['Date']
ebola5.reindex(head_range)
print(ebola5.iloc[:,:5])
(1)频率
pandas的date_range函数有一个参数freq,其默认值为D(代表day),表示日期范围内的值是逐日递增的。
别名 | 说明 | 别名 | 说明 |
B | 工作日 | QS | 季度初 |
C | 自定义工作日 | BQS | 季度初工作日 |
D | 日历日 | A | 年末 |
W | 每周 | BA | 年末工作日 |
M | 月末 | AS | 年初 |
SM | 月中和月末 (每月第15天和月末) | BAS | 年初工作日 |
BM | 月末工作日 | BH | 工作时间 |
CBM | 自定义月末工作日 | H | 小时 |
MS | 月初 | T | 分钟 |
SMS | 月初和月中 (每月第1天和第15天) | S | 秒 |
BMS | 月初工作日 | L | 毫秒 |
CBMS | 自定义月初工作日 | U | 微秒 |
Q | 季度末 | N | 纳秒 |
BQ | 季度末工作日 |
# 输出2017年1月1日至7日所有的工作日
print(pd.date_range('2017-01-01','2017-01-07',freq='B'))
(2)偏移量
偏移量是在基本频率基础上做的一点调整。如下:
# 从2017年1月1日这周每隔一天取一个工作日
print(pd.date_range('2017-01-01','2017-01-07',freq='2B'))
# 2017年每个月的第一个星期四
print(pd.date_range("2017-01-01","2017-12-31",freq="WOM-1THU"))
# 2017年每个月的第三个星期五
print(pd.date_range("2017-01-01","2017-12-31",freq="WOM-3FRI"))
3、重采样
重采样会把datetime从一个频率转换为另一个频率。重采样有如下3类。
(1)下采样:从高频率到低频率(比如从每天到每月)
(2)上采样:从低频率到高频率(比如从每月到每天)
(3)原样采样:采样频率不变(比如从每月的第一个星期四到每月的最后一个星期五)
# 下采样:从每天到每月
# 这里有多个值,需要把结果聚合起来
# 这里用mean函数
ebola.index=ebola.Date
down=ebola.resample('M')
print(type(down))
print(down.mean().iloc[:5,:5])