零填充的熊猫重采样总和

时间:2020-07-31 07:44:33

标签: python pandas time-series

在对具有平均汇总的系列(每天至每月)进行重新采样时->缺少的日期时间填充有NaN,这是可以的,因为我们可以使用.dropna()函数将其删除, 但是,使用总和/总计聚合->缺少的日期时间会填充0(零),这在技术上是正确的,但由于要删除它们需要使用掩码,因此有点麻烦。 问题是,是否有一种更有效的方法来对总和进行重采样而不填充零或使用掩码?最好与dropna()类似,但要丢弃0。

例如:

ser = pd.Series([1]*6)
ser.index = pd.to_datetime(['2000-01-01', '2000-01-02', '2000-03-01', '2000-03-02', '2000-05-01', '2000-05-02'])
# wanted output
# 2000-01-31    2.0
# 2000-03-31    2.0
# 2000-05-31    2.0

# ideal output but for aggregate sum.
ser.resample('M').mean().dropna()
# 2000-01-31    1.0
# 2000-03-31    1.0
# 2000-05-31    1.0

# not ideal
ser.resample('M').sum()
# 2000-01-31    2
# 2000-02-29    0
# 2000-03-31    2
# 2000-04-30    0
# 2000-05-31    2

.groupby().grouper()一起使用似乎具有重采样的确切行为。

# not ideal
ser.groupby(pd.Grouper(freq='M')).sum()
# 2000-01-31    2
# 2000-02-29    0
# 2000-03-31    2
# 2000-04-30    0
# 2000-05-31    2

.groupby()index.year一起使用也是可行的,但是,日历月似乎没有“身份”。请注意,.index.month不是我们追求的目标。

ser = pd.Series([1]*6)
ser.index = pd.to_datetime(['2000-01-01', '2000-01-02', '2002-03-01', '2002-03-02', '2005-05-01', '2005-05-02'])
ser.groupby(ser.index.year).sum()
# 2000    2
# 2002    2
# 2005    2

1 个答案:

答案 0 :(得分:2)

使用pd.offsets.MonthEnd并将其与DatetimeIndex中的ser相加以创建月末石斑鱼,然后将Series.groupby与该石斑鱼一起使用并使用sum进行汇总或mean

grp = ser.groupby(ser.index + pd.offsets.MonthEnd()) 
s1, s2 = grp.sum(), grp.mean()

结果:

print(s1)
2000-01-31    2
2002-03-31    2
2005-05-31    2
dtype: int64

print(s2)
2000-01-31    1
2002-03-31    1
2005-05-31    1
dtype: int64