使用全局最小值和最大值指定填充方法的 pandas resample

问题描述 投票:0回答:3

我想重新采样一个数据集,每个系列的最小日期对于每个系列应该相同,因此,每个系列的最小日期应该是 date 列的最小值。最大日期相同(而不是在系列级别重新采样,我想重新采样以获取全局最大值)。

这就提出了一个新问题,我如何在重采样时指定我想要 0 的空值。

我的意思是,假设这种情况:

系列col 约会 价值
系列_1 2023-02-06 5
系列_1 2023-02-23 7

如果你注意到,我会错过中间的系列:(每周重新采样)

系列col 约会 价值
系列_1 2023-02-13 0

我想知道以下代码在做什么?如何填充该值?因为我没有指定任何内容,并且在重新采样时我没有看到空值。pandas 文档

df.groupby('series_col').resample('W', on='date', label='left', loffset=pd.DateOffset(days=0))['value'].sum().reset_index()
python pandas resampling
3个回答
1
投票

您可以使用弱日历表作为维度并对您的数据进行全连接


0
投票

您的数据框由:

import pandas as pd

data = {'series_col': ['series_1', 'series_1'],
        'date': ['2023-02-06', '2023-02-23'],
        'value': [5, 7]}

df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])

和你的代码

df1 = df.groupby('series_col').resample('W', on='date', label='left', loffset=pd.DateOffset(days=0))['value'].sum().fillna(0).reset_index()
print(df1)

退货

  series_col       date  value
0   series_1 2023-02-05      5
1   series_1 2023-02-12      0
2   series_1 2023-02-19      7

所以它的解释如下:

您正在按

df
对 DataFrame
series_col
进行分组。您使用
date
列上的每周频率('W')对每个组进行重新采样。

因此,您将重新采样的值作为每个每周周期的

value
s 的总和。

label='left' 
参数告诉你每个周期的标签应该代表区间的左端点,而
loffset=pd.DateOffset(days=0)
给你一个零日偏移来调整标签到左端点。

现在,默认情况下,当使用 Pandas 进行重采样时,任何缺失值都将用

NaN
填充。但是,您提供了
fillna(0)
,这就是为什么您得到 0 而不是
NaN
的原因。


0
投票

我是怎么做到的(我想不是 pythonic 方式)。

  1. 取dataframe的最小值。
  2. 取dataframe的最大值。
  3. 创建一个日历数据框,它将有 2 行,最小日期和最大日期。
  4. 每周重新采样日历
  5. 外部加入日历和数据集,我需要每个系列具有相同的长度。

代码:

min_date = df['date'].min()
max_date = df['date'].max()

data = {'date': [min_date, max_date]}
df_aux = pd.DataFrame(data)+

df.set_index('date', inplace=True)
df_calendar = df.resample('W').asfreq().reset_index()

df_full_resampled = df_calendar.merge(df, left_on='date', right_on= 'series_id', how='left')
© www.soinside.com 2019 - 2024. All rights reserved.