Pandas时间序列处理

2022-09-12 08:37:52

一、时间序列数据的生成

pd.date_ranges生成时间序列

  • time格式:年月日分隔符号可以是"-","/",空格这三种格式(年月日、日月年、月日年都可以);时分秒只能用":"分隔,顺序只能是时分秒。
  • start:起始时间(time)
  • end:终止时间(time)
  • periods:期数(int),使用时只能出现start或者end,两者不能同时出现
  • freq:频率(numY,num年;numM,num月;numD,num日),详细参数见下表
频率别名描述
B工作日频率
C自定义工作日频率
D日历日频率
W每周频率
M每月最后一个日历日
SM每半个月最后一个日历日(15日和月末)
BM每月最后一个工作日
CBM自定义每月最后一个工作日
MS每月第一个日历日
SMS每半月第一个日历日(第1和第15)
BMS每月第一个工作日
CBMS自定义每月第一个工作日
Q每季度最后一个月的最后一个日历日
BQ每季度最后一个月的最后一个工作日
QS每季度最后一个月的第一个日历日
BQS每季度最后一个月的第一个工作日
A, Y每年的最后一个日历日
BA, BY每年的最后一个工作日
AS, YS每年的第一个日历日
BAS, BYS每年的第一个工作日
BH工作日按“时”计算频率
H每小时频率
T, min每分钟频率
S每秒频率
L, ms毫秒频率
U, us微秒频率
N纳秒频率
import pandasas pdimport numpyas np
df= pd.DataFrame( data=np.random.randint(1,20,10),
                  index=pd.date_range(start="20/01/2021",periods=10,freq="M"),)print(df)
             0
2021-01-31   1
2021-02-28   6
2021-03-31  12
2021-04-30   5
2021-05-31   7
2021-06-30   4
2021-07-31   9
2021-08-31   7
2021-09-30  18
2021-10-31  10
             0
count  10.00000
mean    7.90000
std     4.72464
min     1.00000
25%     5.25000
50%     7.00000
75%     9.75000
max    18.00000

二、Pandas设置索引

  • 创建时添加索引
pd.DataFrame(...,index=[],...)
  • df.set_index使用现有列设置索引
    • keys:列名,多个列用[name1,name2]
    • drop:设置升序(True)、降序(False)
    • inplace:替换原变量(True),不替换(False)
df.set_index(["X"],inplace=True)
df.set_index(["X","Y"],inplace=True)
  • df.reset_index可以还原索引
df.reset_index("X")

三、 时间序列数据的截取

df.truncate过滤数据

  • before:过滤之前的数据(time)
  • after:过滤之后的数据(time)
  • axis:列(columns),行(index)
df.truncate(before="2021-5",after="2021-9")
           0
2021-05-31  7
2021-06-30  4
2021-07-31  9
2021-08-31  7

df.loc索引过滤

df.loc["2021-5":]
             0
2021-05-31   7
2021-06-30   4
2021-07-31   9
2021-08-31   7
2021-09-30  18
2021-10-31  10

四、Pandas重复值处理

4.1 查询是否有重复值

duplicated()方法判断

# 判断dataframe数据整行是否重复
df.duplicated()# dataframe数据某列是否重复
df.columns_name.duplicated()# 判断dataframe数据多列数据是否重复(多列组合查)
df.duplicated(subset=['n1','n2'])

groupby().count()

df.groupby('columns').count()>1

4.2 去除重复值

drop_duplicats参数说明:

  • 参数subset:用来指定特定的列,默认所有列
  • 参数keep:first和last表示是选择最前一项还是最后一项保留,默认first
  • 参数inplace:是直接在原来数据上修改还是保留一个副本,默认为False
df.drop_duplicats(subset=['name1','name2'],keep='last',inplace=True)

按照index索引去重

df.index.duplicated(keep='last')

五、Pandas缺失值处理

5.1 缺失值查询

df.info查询各列的信息

df.info()# res<class'pandas.core.frame.DataFrame'>
Int64Index:10 entries,19 to14
Data columns(total2 columns):#   Column  Non-Null Count  Dtype----------------------------0   Y10 non-null     int321   Z10 non-null     int32
dtypes: int32(2)
memory usage:160.0bytes

df.isnull判断是否是空值

df.isnull().any()# 筛选出缺失值的列
df.isna().any()# 筛选出缺失值的列

df.empty判断是否有空值

df.empty

5.2 缺失值填充

ffill 空值取前面的值

df.ffill()

bfill 空值取后面的值

df.bfill()

fillna 指定值填充

df.fillna(1)
df.fillna({'A':0,'B':1,'C':2,'D':3})# 指定列填充

interpolate 插值

  • df.interpolate(method=‘linear’, axis=0, limit=None, inplace=False, limit_direction=‘forward’, limit_area=None, downcast=None, **kwargs)
  • method参数解释
    • linear:忽略索引,线性等距插值
    • time:在以天或者更高频率的数据上插入给定的时间间隔长度数据
    • index, values:使用索引的实际数值
    • pad:使用现有值填写NaN
    • nearest, zero, slinear, quadratic, cubic, spline, barycentric, polynomial:传递给scipy.interpolate.interp1d。这些方法使用索引的数值。polynomial和spline都要求您还指定一个顺序(int),例如 ,df.interpolate(method=‘polynomial’, order=5)
    • krogh,piecewise_polynomial,spline,pchip,akima:包括类似名称的SciPy插值方法。
    • from_derivatives:指 scipy.interpolate.BPoly.from_derivatives,它替换了scipy 0.18中的’piecewise_polynomial’插值方法
  • axis : {0或’index’,1或’columns’,None},默认为None;沿轴进行interpolate。
  • limit: int;要填充的连续NaN的最大数量。必须大于0
  • inplace : bool,默认为False;如果可以,更新现有数据
  • limit_direction : {‘forward’,‘backward’,‘both’},默认为’forward’;如果指定了限制,则将沿该方向填充连续的NaN
  • limit_area : {None, ‘inside’, ‘outside’}, 默认为None;如果指定了限制,则连续的NaN将填充此限制。
    None:无填充限制
  • inside:仅填充有效值包围的NaN
  • outside: 仅在有效值之外填充NaN
dff.interpolate(method='polynomial',order=2)

删除缺失值

df.dropna(how='any')

六、pandas统计计算方法

方法说明
count非NaN值的数理
describe列计算统计汇总
min、max最小值和最大值
argmin、argmax最小值和最大值索引(int)
idxmin、idxmax最小值和最大值索引
quantile分位数([0,1],0.25下四分为)
sum总和
mean均值
median0.5分位数,中位数
mad根据均值计算绝对离差
var方差
std标准差
df.describe()

七、Pandas数据重采样

重采样就是基于时间数据由一个频率转换到另一个频率的方法,分为降采样和升采样。

  • 降采样:高频率===>低频率,如频率日变为月,需要指定统计函数如sum
df.resample("M").mean()
  • 升采样:低频率===>高频率,如频率月变为日,需要进行缺失值填充
df.resample("D").asfreq().fillna(1)
  • 作者:而又何羡乎
  • 原文链接:https://blog.csdn.net/qq_44285092/article/details/117638171
    更新时间:2022-09-12 08:37:52