【问题标题】:Resampling with Pandas用 Pandas 重采样
【发布时间】:2013-06-09 09:57:01
【问题描述】:

我有一个类似于以下文件的数据集

2013-05-30 06:00:41    173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106
2013-05-30 06:20:42    61.245.172.14

我想重新采样 20 分钟并获取特定 20 分钟时间段的命中数。(例如,在(06.00.00-06.20.00 或 06.40.00-07.00.00 等)之间。我可以打印整个数据文件的命中计数如下。

ips = df.groupby('IP').size()

如何获取每 20 分钟插槽的命中数?下面的代码只打印 '06:00:00' 和 '06:20:00' 之间的所有 IP。

df_s = df['IP'].resample('20t', how='count')
print df['IP'].between_time('06:00:00', '06:20:00')

【问题讨论】:

  • 你的 df_s 是什么样的?我不认为我可以用 pandas 0.11 复制它。我的 6:00 广告位包含三个匹配项,而我的 6:20 广告位是 1。您是否尝试过设置 closed=label= 关键字?默认的 bins 定义可能与您的预期不同。
  • @Rutger Kassies 这个怎么样?但我必须指定时间段? new = DataFrame(df['IP'].between_time('06:00:00', '06:20:00')) t = new.groupby('IP').size()

标签: python pandas ipython-notebook


【解决方案1】:

这是 0.11.1 中可用的新方法(即将推出),提供组过滤机制,感谢@DanAllen

In [49]: df
Out[49]: 
                                  ip
date_time                           
2013-05-30 06:00:41  173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106
2013-05-30 06:20:42    61.245.172.14

In [50]: df.groupby(pd.TimeGrouper('20min')).filter(lambda x: x.between_time('06:00:00', '06:20:00'))
Out[50]: 
                                  ip
date_time                           
2013-05-30 06:00:41  173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106

【讨论】:

  • 谢谢,但必须等待 :)!在那之前,我想每 20 分钟获得一次 IP?你能建议我一个方法吗?
  • @AndyHayden 下面的方法会起作用,或者你还有什么别的追求吗?
  • df1.IP.between_time('06:00:00', '06:20:00') 这部分,我想自动获取,我的意思是每隔 2o 分钟的插槽凝视打印一次 IP从 06:00:00 开始?
【解决方案2】:

第一个计算每个 20 分钟时隙中的所有行

In [11]: df1.IP.resample('20t', how='count')  # I usually prefer '20min'
Out[11]:
datetime
2013-05-30 06:00:00    3
2013-05-30 06:20:00    1
dtype: int64

第二个在特定时间之间抓取这些行:

In [12]: df1.IP.between_time('06:00:00', '06:20:00')
Out[12]:
datetime
2013-05-30 06:00:41    173.199.116.171
2013-05-30 06:05:41      61.245.172.14
2013-05-30 06:10:42      74.86.158.106
Name: IP, dtype: object

可能使用 TimeGrouper 来解决一般问题(因此您无需指定时间间隔),但这是我能做的最好的,打印所有分组:

In [13]: tg = pd.TimeGrouper('20t')

In [14]: g = df1.groupby(tg)

In [15]: def f(x):
             print x
             return x

In [16]: _ = g.apply(f)                # the '_ =' bit just suppresses ouput
                                  IP
datetime
2013-05-30 06:00:41  173.199.116.171
2013-05-30 06:05:41    61.245.172.14
2013-05-30 06:10:42    74.86.158.106
                                IP
datetime
2013-05-30 06:20:42  61.245.172.14

【讨论】:

  • 谢谢安迪! 'TimeGrouper' 这对我很重要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2014-07-24
  • 2019-04-15
  • 2016-01-26
  • 2018-07-14
  • 2020-09-29
  • 2012-08-24
相关资源
最近更新 更多