在 pandas 中使用带有零的多索引重采样会导致 NaN

Using multindex resample in pandas with zeros results in 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
...