在具有零的Panda中使用多指标重采样会导致NaN



我有一个数据帧,看起来像这样。。。

name            datetime    value
1           Michael 2012-01-11 01:11:19     3999
3             Janus 2014-01-11 00:01:10        1
4             Janus 2014-01-11 01:12:29       81 
5             Janus 2014-01-11 01:11:19     8047
...             ...                 ...      ...
9001230  Excalibur1 2014-12-25 01:11:10        1
9001231  Excalibur1 2014-12-25 02:11:10        2
9001232  Excalibur1 2013-12-25 03:11:10        3
9001233  Excalibur1 2014-12-25 04:11:10        4
9001234  Excalibur1 2014-12-25 05:11:10      907

我想知道,对于每个名字,每天的总价值是多少。

在没有列出值的日子里,我希望这些日子仍然存在,并且我想填充零。

我可以做以下事情,这似乎只是有时零填充:

df.set_index(["datetime"]).groupby("name").resample("D")["value"].sum()
name        datetime
Michael     2012-01-11     3999
Janus       2014-01-11     8129
2014-10-12        0
2014-10-13        0
2014-10-14        0
...  
Excalibur1  2014-12-21        0
2014-12-22        1
2014-12-23        0
2014-12-24        0
2014-12-25      917

为什么/有时/用零填充,正确的矩形化方法是什么,这样我就可以在没有记录的情况下将所有日期相加并用零填充?

更新

我想要的索引由。。。

index=pd.MultiIndex.from_product([
pd.date_range(
df["datetime"].dt.date.min(),  
df["datetime"].dt.date.max(), freq="D"),
sorted(df["name"].unique()
)

而且密度很大。

不要resample,而是使用groupby:中的日期

df['datetime'] = pd.to_datetime(df['datetime'])
df.groupby(['name', df['datetime'].dt.date]).sum()

或者,使用pandas.Grouper实现灵活性:

df.groupby(['name', pd.Grouper(key='datetime', freq='D')]).sum()

输出:

value
name       datetime         
Excalibur1 2013-12-25      3
2014-12-25    914
Janus      2014-01-11   8129
Michael    2012-01-11   3999

矩形和缺少日期:

对于矩形使用:

df2 = df.groupby(['name', pd.Grouper(key='datetime', freq='D')])['value'].sum().unstack(level='name', fill_value=0)

输出:

name        Excalibur1  Janus  Michael
datetime                              
2013-12-25           3      0        0
2014-12-25         914      0        0
2014-01-11           0   8129        0
2012-01-11           0      0     3999

为了添加缺失的日期,reindex:

df2 = df.groupby(['name', pd.Grouper(key='datetime', freq='D')])['value'].sum().unstack(level='name', fill_value=0)
df2 = df2.reindex(pd.date_range(df['datetime'].dt.date.min(), df['datetime'].max()), fill_value=0)

输出:

name        Excalibur1  Janus  Michael
2012-01-11           0      0     3999
2012-01-12           0      0        0
2012-01-13           0      0        0
2012-01-14           0      0        0
2012-01-15           0      0        0
...

最新更新