使用 groupby 和 resample 对 Pandas 进行上采样

Cod*_*key 3 python pandas pandas-groupby

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

date在每个id.

以下有效,但在我不需要 NaN 的地方给了我零

data.groupby('id').resample('D', on='date').sum()\
    .drop('id', axis=1).reset_index()
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

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

我尝试使用pandas.Grouperwithset_index多级索引或 single 但它似乎没有对我的日期列进行上采样,所以我得到了连续的日期,或者它不尊重该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')
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

从以下位置创建DatetimeIndex和删除参数:onresample

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

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

print (data.groupby('id').resample('D', on='date').sum(min_count=1))
Run Code Online (Sandbox Code Playgroud)