【问题标题】:Pandas datetime resample count non-zero熊猫日期时间重采样计数非零
【发布时间】:2018-06-22 18:10:45
【问题描述】:

我有一个时间序列的每日降雨数据,如下所示:

                     PRCP
year_month_day           
1797-01-01 00:00:00   0.0
1797-01-02 00:00:00   0.0
1797-01-03 00:00:00   1.1
1797-01-04 00:00:00   0.0
1797-01-05 00:00:00   3.5
1797-02-01 00:00:00   8.1
1797-02-02 00:00:00   3.0
1797-02-03 00:00:00   0.0
1797-02-04 00:00:00   0.0
1797-02-05 00:00:00   0.0
1797-03-01 00:00:00   0.0
1797-03-02 00:00:00   0.0
1797-03-03 00:00:00   0.0
1797-03-04 00:00:00   0.0
1797-03-05 00:00:00   1.5
1797-04-01 00:00:00   6.3
1797-04-02 00:00:00  24.0
1797-04-03 00:00:00   0.0
1797-04-04 00:00:00   2.2
1797-04-05 00:00:00   5.9
1797-05-01 00:00:00   0.0
1797-05-02 00:00:00  15.9
1797-05-03 00:00:00   0.0
1797-05-04 00:00:00   0.0
1797-05-05 00:00:00   0.0
1797-06-01 00:00:00   1.6
1797-06-02 00:00:00   0.0
1797-06-03 00:00:00   0.0
1797-06-04 00:00:00   7.9
1797-06-05 00:00:00   0.0

我已经能够将它与索引列一起作为 pandas 日期时间对象导入。我正在尝试计算每月所有非零雨天。我可以按月分组:

grouped = df.groupby(pd.Grouper(freq='M'))

并且可以通过以下方式计算每个月的所有内容:

raindays = grouped.resample("M").count()

但这也计算降雨量为 0 的天数。我发现了有关使用nunique() 的提示,但它似乎不适用于重采样。例如:

raindays = grouped.resample("M").nunique()

返回错误:

AttributeError: 'DataFrameGroupBy' object has no attribute 'nunique'

有没有办法计算分组熊猫对象中的非零值?

【问题讨论】:

  • df.resample('M').apply(lambda sdf: sdf.PRCP.ne(0).sum()) 也应该可以工作。但我相信,首先屏蔽往往会更快。

标签: python pandas datetime


【解决方案1】:

屏蔽那些 0,然后重试。

df.mask(df.PRCP.eq(0)).groupby(pd.Grouper(freq='M')).count()

或者,更明显的版本是replace。

df.replace({0 : np.nan}).groupby(pd.Grouper(freq='M')).count()

                PRCP
year_month_day      
1797-01-31         2
1797-02-28         2
1797-03-31         1
1797-04-30         4
1797-05-31         1
1797-06-30         2

【讨论】:

  • 太棒了!我不知道面具。很有用。谢谢。
【解决方案2】:

使用factorize 和bincount

f, u = pd.factorize(df.index + pd.offsets.MonthEnd(0))
pd.Series(np.bincount(f, df.PRCP.values != 0).astype(int), u)

1797-01-31    2
1797-02-28    2
1797-03-31    1
1797-04-30    4
1797-05-31    1
1797-06-30    2
dtype: float64

【讨论】:

  • 谢谢。有什么特别的理由选择这种方法而不是@coldspeed 提供的使用mask 的方法吗?
  • @Computarch 应该很快。我倾向于这样想。分享这种想法的唯一方法是展示示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2013-01-09
  • 2016-10-16
  • 1970-01-01
  • 2020-06-08
  • 2016-11-25
相关资源
最近更新 更多