Pandas —— resample()重采样和asfreq()频度转换方式

 更新时间:2020年02月26日 09:48:06   作者:starter_zheng  
今天小编就为大家分享一篇Pandas —— resample()重采样和asfreq()频度转换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

resample()

resample()进行重采样。

重采样(Resampling)指的是把时间序列的频度变为另一个频度的过程。把高频度的数据变为低频度叫做降采样(downsampling),把低频度变为高频度叫做增采样(upsampling)。

降采样

考虑因素:

各区间哪边是闭合的(参数:closed)

如何标记各聚合面元,用区间的开头还是末尾(参数:label)

In [232]: ts_index = pd.date_range('2018-08-03',periods =12,freq = 'T')

In [233]: ts = pd.Series(np.arange(12),index = ts_index)

In [234]: ts
Out[234]:
2018-08-03 00:00:00  0
2018-08-03 00:01:00  1
2018-08-03 00:02:00  2
2018-08-03 00:03:00  3
2018-08-03 00:04:00  4
2018-08-03 00:05:00  5
2018-08-03 00:06:00  6
2018-08-03 00:07:00  7
2018-08-03 00:08:00  8
2018-08-03 00:09:00  9
2018-08-03 00:10:00 10
2018-08-03 00:11:00 11
Freq: T, dtype: int32

默认使用左标签(label=‘left'),左闭合(closed='left')

此时第一个区间为:2018-08-03 00:00:00~2018-08-03 00:04:59,故sum为10,label为:2018-08-03 00:00:00

In [235]: ts.resample('5min').sum()
Out[235]:
2018-08-03 00:00:00 10
2018-08-03 00:05:00 35
2018-08-03 00:10:00 21
Freq: 5T, dtype: int32

可以指定为右闭合(closed='right'),默认使用左标签(label=‘left')

此时第一个区间为:2018-08-02 23:55:01~2018-08-03 00:00:00,故sum为0,label为:2018-08-02 23:55:00

In [236]: ts.resample('5min',closed='right').sum()
Out[236]:
2018-08-02 23:55:00  0
2018-08-03 00:00:00 15
2018-08-03 00:05:00 40
2018-08-03 00:10:00 11
Freq: 5T, dtype: int32

可以指定为右闭合(closed='right'),右标签(label=‘right')

此时第一个区间为:2018-08-02 23:55:01~2018-08-03 00:00:00,故sum为0,label为:2018-08-03 00:00:00

In [237]: ts.resample('5min',closed='right',label='right').sum()
Out[237]:
2018-08-03 00:00:00  0
2018-08-03 00:05:00 15
2018-08-03 00:10:00 40
2018-08-03 00:15:00 11
Freq: 5T, dtype: int32

升采样

考虑因素:

没有聚合,但是需要填充

In [244]: frame = pd.DataFrame(np.random.randn(2, 4),
  ...:      index=pd.date_range('1/1/2000', periods=2,
  ...:           freq='W-WED'), # freq='W-WED'表示按周
  ...:      columns=['Colorado', 'Texas', 'New York', 'Ohio'])

In [245]: frame
Out[245]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-12 -0.711291 -1.070133 1.469272 0.809806

当我们对这个数据进行聚合的的时候,每个组只有一个值,以及gap(间隔)之间的缺失值。在不使用任何聚合函数的情况下,

我们使用asfreq方法将其转换为高频度:

In [246]: df_daily = frame.resample('D').asfreq()

In [247]: df_daily
Out[247]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-06  NaN  NaN  NaN  NaN
2000-01-07  NaN  NaN  NaN  NaN
2000-01-08  NaN  NaN  NaN  NaN
2000-01-09  NaN  NaN  NaN  NaN
2000-01-10  NaN  NaN  NaN  NaN
2000-01-11  NaN  NaN  NaN  NaN
2000-01-12 -0.711291 -1.070133 1.469272 0.809806

使用ffill()进行填充

In [248]: frame.resample('D').ffill()
Out[248]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-06 1.201713 0.029819 -1.366082 -1.325252
2000-01-07 1.201713 0.029819 -1.366082 -1.325252
2000-01-08 1.201713 0.029819 -1.366082 -1.325252
2000-01-09 1.201713 0.029819 -1.366082 -1.325252
2000-01-10 1.201713 0.029819 -1.366082 -1.325252
2000-01-11 1.201713 0.029819 -1.366082 -1.325252
2000-01-12 -0.711291 -1.070133 1.469272 0.809806

In [249]: frame.resample('D').ffill(limit=2)
Out[249]:
   Colorado  Texas New York  Ohio
2000-01-05 1.201713 0.029819 -1.366082 -1.325252
2000-01-06 1.201713 0.029819 -1.366082 -1.325252
2000-01-07 1.201713 0.029819 -1.366082 -1.325252
2000-01-08  NaN  NaN  NaN  NaN
2000-01-09  NaN  NaN  NaN  NaN
2000-01-10  NaN  NaN  NaN  NaN
2000-01-11  NaN  NaN  NaN  NaN
2000-01-12 -0.711291 -1.070133 1.469272 0.809806

新的日期索引没必要跟旧的重叠

In [250]: frame.resample('W-THU').ffill()
Out[250]:
   Colorado  Texas New York  Ohio
2000-01-06 1.201713 0.029819 -1.366082 -1.325252
2000-01-13 -0.711291 -1.070133 1.469272 0.809806

分组重采样

In [279]: times = pd.date_range('2018-08-3 00:00', freq='1min', periods=10)

In [280]: df2 = pd.DataFrame({'time': times.repeat(3),
  ...:      'key': np.tile(['a', 'b', 'c'], 10),
  ...:      'value': np.arange(30)})

In [281]: df2[:5]
Out[281]:
 key    time value
0 a 2018-08-03 00:00:00  0
1 b 2018-08-03 00:00:00  1
2 c 2018-08-03 00:00:00  2
3 a 2018-08-03 00:01:00  3
4 b 2018-08-03 00:01:00  4

In [282]: df2.groupby(['key',pd.Grouper(key='time',freq='5min')]).sum()
Out[282]:
       value
key time
a 2018-08-03 00:00:00  30
 2018-08-03 00:05:00 105
b 2018-08-03 00:00:00  35
 2018-08-03 00:05:00 110
c 2018-08-03 00:00:00  40
 2018-08-03 00:05:00 115

asfreq()

asfreq()进行频度转换。

>>> index = pd.date_range('1/1/2000', periods=4, freq='T')
>>> series = pd.Series([0.0, None, 2.0, 3.0], index=index)
>>> df = pd.DataFrame({'s':series})
>>> df
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:01:00 NaN
2000-01-01 00:02:00 2.0
2000-01-01 00:03:00 3.0

将频度转换为30s

>>> df.asfreq(freq='30S')
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:00:30 NaN
2000-01-01 00:01:00 NaN
2000-01-01 00:01:30 NaN
2000-01-01 00:02:00 2.0
2000-01-01 00:02:30 NaN
2000-01-01 00:03:00 3.0

将频度转换为2min,不会进行重采样(与resample的不同之处)

>>> df.asfreq(freq='2min')
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:02:00 2.0

使用bfill()进行填充

>>> df.asfreq(freq='30S').bfill()
      s
2000-01-01 00:00:00 0.0
2000-01-01 00:00:30 NaN
2000-01-01 00:01:00 NaN
2000-01-01 00:01:30 2.0
2000-01-01 00:02:00 2.0
2000-01-01 00:02:30 3.0
2000-01-01 00:03:00 3.0

以上这篇Pandas —— resample()重采样和asfreq()频度转换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何用python将单引号替换为双引号

    如何用python将单引号替换为双引号

    这篇文章主要介绍了如何用python将单引号替换为双引号,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 简述python&pytorch 随机种子的实现

    简述python&pytorch 随机种子的实现

    这篇文章主要介绍了简述python&pytorch 随机种子的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 详解如何利用Python进行客户分群分析

    详解如何利用Python进行客户分群分析

    每个电子商务数据分析师必须掌握的一项数据聚类技能,如果你是一名在电子商务公司工作的数据分析师,从客户数据中挖掘潜在价值,来提高客户留存率很可能就是你的工作任务之一。这篇就来告诉你如何将客户分成不同的群组,并在一段时间内观察每个群组的留存率
    2023-02-02
  • 关于Keras模型可视化教程及关键问题的解决

    关于Keras模型可视化教程及关键问题的解决

    今天小编就为大家分享一篇关于Keras模型可视化教程及关键问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python银行卡号码校验Luhn模10算法

    python银行卡号码校验Luhn模10算法

    这篇文章主要为大家介绍了python银行卡号码校验Luhn模10算法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 详解python3实现的web端json通信协议

    详解python3实现的web端json通信协议

    本篇文章主要介绍了python3实现的web端json通信协议,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • 基于PyQt4和PySide实现输入对话框效果

    基于PyQt4和PySide实现输入对话框效果

    这篇文章主要为大家详细介绍了基于PyQt4和PySide实现输入对话框效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 利用keras使用神经网络预测销量操作

    利用keras使用神经网络预测销量操作

    这篇文章主要介绍了利用keras使用神经网络预测销量操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Pandas加速代码之避免使用for循环

    Pandas加速代码之避免使用for循环

    如果你使用Python和Pandas进行数据分析,循环是不可避免要使用的。这篇文章主要给大家介绍了关于Pandas加速代码之避免使用for循环的相关资料,需要的朋友可以参考下
    2021-05-05
  • Python faker生成器生成虚拟数据代码实例

    Python faker生成器生成虚拟数据代码实例

    这篇文章主要介绍了Python faker生成器生成虚拟数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论