在对具有平均汇总的系列(每天至每月)进行重新采样时->缺少的日期时间填充有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
答案 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