时间序列的重采样和pandas的resample方法介绍( 二 )

'both''neither',默认是 'right'

  • 可以使用loffset参数来调整重新采样后的时间标签的偏移量 。
  • 最后,你可以使用聚合函数的特定参数,例如'sum'函数的min_count参数来指定非NA值的最小数量 。
  • 1、指定列名
    默认情况下,Pandas的resample()方法使用Dataframe或Series的索引,这些索引应该是时间类型 。但是 , 如果希望基于特定列重新采样,则可以使用on参数 。这允许您选择一个特定的列进行重新采样 , 即使它不是索引 。
     df.reset_index(drop=False, inplace=True) df.resample('W', on='index')['C_0'].sum().head()在这段代码中 , 使用resample()方法对'index'列执行每周重采样,计算每周'C_0'列的和 。
    2、指定开始和结束的时间间隔
    closed参数允许重采样期间控制打开和关闭间隔 。默认情况下,一些频率,如'M','A','Q', 'BM', 'BA','BQ'和'W'是右闭的,这意味着包括右边界,而其他频率是左闭的,其中包括左边界 。在转换数据频率时,可以根据需要手动设置关闭间隔 。
     df = generate_sample_data_datetime() pd.concat([df.resample('W', closed='left')['C_0'].sum().to_frame(name='left_closed'),            df.resample('W', closed='right')['C_0'].sum().to_frame(name='right_closed')],          axis=1).head(5)在这段代码中,我们演示了将日频率转换为周频率时左闭间隔和右闭间隔的区别 。
    3、输出结果控制
    【时间序列的重采样和pandas的resample方法介绍】label参数可以在重采样期间控制输出结果的标签 。默认情况下,一些频率使用组内的右边界作为输出标签,而其他频率使用左边界 。在转换数据频率时,可以指定是要使用左边界还是右边界作为输出标签 。
     df = generate_sample_data_datetime() df.resample('W', label='left')['C_0'].sum().to_frame(name='left_boundary').head(5) df.resample('W', label='right')['C_0'].sum().to_frame(name='right_boundary').head(5)在这段代码中,输出标签是根据在label参数中指定“left”还是“right”而变化的,建议在实际应用时显式指定 , 这样可以减少混淆 。
    4、汇总统计数据
    重采样可以执行聚合统计,类似于使用groupby 。使用sum、mean、min、max等聚合方法来汇总重新采样间隔内的数据 。这些聚合方法类似于groupby操作可用的聚合方法 。
     df.resample('D').sum() df.resample('W').mean() df.resample('M').min() df.resample('Q').max() df.resample('Y').count() df.resample('W').std() df.resample('M').var() df.resample('D').median() df.resample('M').quantile([0.25, 0.5, 0.75]) custom_agg = lambda x: x.max() - x.min() df.resample('W').Apply(custom_agg)上采样和填充在时间序列数据分析中,上采样和下采样是用来操纵数据观测频率的技术 。这些技术对于调整时间序列数据的粒度以匹配分析需求非常有价值 。
    我们先生成一些数据
     import pandas as pd import numpy as np   def generate_sample_data_datetime():    np.random.seed(123)    number_of_rows = 365 * 2    num_cols = 5    start_date = '2023-09-15' # You can change the start date if needed    cols = ["C_0", "C_1", "C_2", "C_3", "C_4"]    df = pd.DataFrame(np.random.randint(1, 100, size=(number_of_rows, num_cols)), columns=cols)    df.index = pd.date_range(start=start_date, periods=number_of_rows)    return df  df = generate_sample_data_datetime()上采样包括增加数据的粒度,这意味着将数据从较低的频率转换为较高的频率 。
    假设您有上面生成的每日数据 , 并希望将其转换为12小时的频率 , 并在每个间隔内计算“C_0”的总和:
     df.resample('12H')['C_0'].sum().head(10)代码将数据重采样为12小时的间隔,并在每个间隔内对' C_0 '应用总和聚合 。这个.head(10)用于显示结果的前10行 。
    在上采样过程中 , 特别是从较低频率转换到较高频率时 , 由于新频率引入了间隙,会遇到丢失数据点的情况 。所以需要对间隙的数据进行填充,填充一般使用以下几个方法:


    推荐阅读