初学pandas(七)坑爹版本与resamp…

  起因是写好的一程序,放到服务器上跑就失败了。搜索网上半天没找着原因。
  pandas有个库可以让一时间序列按周(月或年等)汇总,如进行数据分析的时候,需要将不均匀的时间戳数据按照月来汇总排列,那么就需要用到resample函数。使用resample有个要求,就是dataframe的index要为时间序列类型的。一般的index不是从0到n,就是字符串,那样的话没办法resample。所以我们要这么转换,随便取一列,或者从别的地方给它安插一列时间类型的index,构成时间序列:
time_series = data[['DATE', 'QUANTITY']]
time_list = pd.to_datetime(time_series['DATE'])  # 转换序列为时间序列
time_series = time_series.set_index(time_list)  # 设置时间序列作为行标签
if pd.__version__ >= "0.18.0":
    time_series = time_series.resample("W-SUN").sum()
else:
    time_series = time_series.resample("W-SUN", how='sum')
time_series = time_series.shift(-6, freq='D')
time_series = time_series.dropna(how='any')
  如代码所示,假设我们有一个n列数据叫data,我们取其中的DATE列和QUANTITY列作为一个新的dataframe。但此时我们是不能进行resample的。有人说是不是把DATE列作为index就可以了呢?答案也是否定的,因为目前DATE还是字符串的状态,不是一个时间序列。为了构成时间序列,我们需要使用pd.to_datetime函数和DATE列构造一个时间列表time_list,并把这样一个列表设置成time_series的index,这样才完整构造一个时间序列。

  接下来就是不同系统之间数字出错的问题了。原来,pandas升级到18版本后,对resample函数进行了重大的改造,因此我们为了添加不同系统的适用性,必须加入一个pd.__version__的版本判断,才能适应不同版本的pandas。
if pd.__version__ >= "0.18.0":
    time_series = time_series.resample("W-SUN").sum()
else:
    time_series = time_series.resample("W-SUN", how='sum')

  接着,就不得不说到resample的统计方式。如果我们按周统计,那么就有个问题:到底是按周几来统计呢?我们发现如下参数"W-SUN",意思是从上周一统计到周日,然后打上了周日的时间戳。同理"W-MON"是从上周二统计到这周一,并打上这周一的标签。
【这里随便编个例子举例,如2016年7月份】
日 一 二 三 四 五 六
10   11   12  13   14   15   16
17   18   19  20   21   22   23
如果我们使用resample函数和参数"W_MON",那么:
date, quantity
2016-7-18, 354
意味着7-12、7-13、7-14、7-15、7-16、7-17、7-18这7天的数据结合在一起,成为7月18日周一这个时间戳的数据。
而如果我们resample函数和参数"W_SUN",那么:
date, quantity
2016-7-17, 301
意味着7-11、7-12、7-13、7-14、7-15、7-16、7-17这7天的数据结合在一起,成为7月18日周一这个时间戳的数据。

如果我们想用7月11号周一来表示7-11、7-12、7-13、7-14、7-15、7-16、7-17这7天数据的时间戳,就必须对时间序列进行平移shift:
time_series = time_series.shift(-6, freq='D')
这样平移 -6 天后,时间戳就从7-17变成了7-11星期一

最后就是根据需求和个人喜好去除没有数据点的时间戳:
time_series = time_series.dropna(how='any')

附录,坑爹的版本升级问题:
初学pandas(七)坑爹版本与resample,按周一汇总

初学pandas(七)坑爹版本与resample,按周一汇总



猜你喜欢

转载自blog.csdn.net/u010770993/article/details/70312504