【问题标题】:Pandas upsampling using groupby and resamplePandas 使用 groupby 和 resample 进行上采样
【发布时间】:2019-01-29 21:56:48
【问题描述】:

我将时间序列与间隔分组。我不想填补空白,尊重分组。

date 在每个id 中都是唯一的。

以下工作,但在我不想 NaN 的地方给了我零

data.groupby('id').resample('D', on='date').sum()\
    .drop('id', axis=1).reset_index()

以下由于某种原因不起作用

data.groupby('id').resample('D', on='date').asfreq()\
    .drop('id', axis=1).reset_index()

data.groupby('id').resample('D', on='date').fillna('pad')\
    .drop('id', axis=1).reset_index()

我收到以下错误: Upsampling from level= or on= selection is not supported, use .set_index(...) to explicitly set index to datetime-like

我尝试将pandas.Grouperset_index 多级索引或单级索引一起使用,但它似乎没有对我的日期列进行上采样,因此我得到连续的日期,或者它不尊重id 列。

Pandas 是 0.23 版

自己试试吧:

data = pd.DataFrame({
'id': [1,1,1,2,2,2],
'date': [
    datetime(2018, 1, 1),
    datetime(2018, 1, 5),
    datetime(2018, 1, 10),
    datetime(2018, 1, 1),
    datetime(2018, 1, 5),
    datetime(2018, 1, 10)],
'value': [100, 110, 90, 50, 40, 60]})

# Works but gives zeros
data.groupby('id').resample('D', on='date').sum()
# Fails
data.groupby('id').resample('D', on='date').asfreq()
data.groupby('id').resample('D', on='date').fillna('pad')

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    创建DatetimeIndex 并从resample 中删除参数on

    print (data.set_index('date').groupby('id').resample('D').asfreq())
                    id
    id date           
    1  2018-01-01  1.0
       2018-01-02  NaN
       2018-01-03  NaN
       2018-01-04  NaN
       2018-01-05  1.0
       2018-01-06  NaN
       2018-01-07  NaN
       2018-01-08  NaN
       2018-01-09  NaN
       2018-01-10  1.0
    2  2018-01-01  2.0
       2018-01-02  NaN
       2018-01-03  NaN
       2018-01-04  NaN
       2018-01-05  2.0
       2018-01-06  NaN
       2018-01-07  NaN
       2018-01-08  NaN
       2018-01-09  NaN
       2018-01-10  2.0
    

    print (data.set_index('date').groupby('id').resample('D').fillna('pad'))
    #alternatives
    #print (data.set_index('date').groupby('id').resample('D').ffill())
    #print (data.set_index('date').groupby('id').resample('D').pad())
                   id
    id date          
    1  2018-01-01   1
       2018-01-02   1
       2018-01-03   1
       2018-01-04   1
       2018-01-05   1
       2018-01-06   1
       2018-01-07   1
       2018-01-08   1
       2018-01-09   1
       2018-01-10   1
    2  2018-01-01   2
       2018-01-02   2
       2018-01-03   2
       2018-01-04   2
       2018-01-05   2
       2018-01-06   2
       2018-01-07   2
       2018-01-08   2
       2018-01-09   2
       2018-01-10   2
    

    编辑:

    如果要使用 sum 缺少值需要 min_count=1 参数 - sum:

    min_count : 整数,默认 0 执行操作所需的有效值数。如果存在的非 NA 值少于 min_count,则结果将为 NA。

    0.22.0 版中的新增功能:添加了默认值为 0。这意味着全 NA 或空系列的总和为 0,而全 NA 或空系列的乘积为 1。

    print (data.groupby('id').resample('D', on='date').sum(min_count=1))
    

    【讨论】:

    • 由于日期不唯一,它无法正常工作。我收到以下错误cannot reindex a non-unique index with a method or limit。每个 id 代表一个时间序列,它们可以重叠,例如,假设您有多个气象站,您不想用 NaN 填充缺失的日期,以便获得连续的每日时间序列。
    • @CodeMonkey - 所以需要预处理数据 - 首先聚合 summean 以获得唯一的日期时间,然后应用此解决方案。给我一些数据样本的时间。
    • 我已经为您添加了示例数据。
    • @CodeMonkey - 我没有收到任何错误,你现在可以检查吗?在 pandas 0.24.0 中测试
    • 谢谢!同时运行整个事情我发现我失败了我自己的一个断言。我无意中删除了一些代码,因此每个 ID 中的日期并不是唯一的。我失败了。
    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 2016-07-23
    • 2018-10-19
    • 2017-08-09
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多