我想重新采样一个数据集,每个系列的最小日期对于每个系列应该相同,因此,每个系列的最小日期应该是 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()
您可以使用弱日历表作为维度并对您的数据进行全连接
您的数据框由:
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
的原因。
我是怎么做到的(我想不是 pythonic 方式)。
代码:
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')