首页 > 解决方案 > Python - 获取两个日期之间的平均值

问题描述

我想获得按商店分组的 2 个日期之间的平均值。

事实上,我有一个按商店和日期销售的第一个 xlsx

shop sell date
a    100  2000
a    122  2001
a    300  2002
b    55   2000
b    245  2001
b    1156 2002

我还有另一个文件,其中包含每个商店的开始和结束日期

shop start stop
a    2000  2002
a    2000  2001
b    2000  2000

所以我想从第二个文件中获取每个日期之间的销售平均值。

我尝试这样的事情,但我得到了一个 Df 列表,它对我来说不是很优化

dfend = []

for i in df2.values:
    filt1 = df.shop == i[0]
    filt2 = df.date >= i[1]
    filt3 = df.date <= i[2]
    dfgrouped = df.where(filt1 & filt2 & filt3).groupby('shop').agg(mean = ('sell','mean'), begin = ('date','min'), end = ('date', 'max'))
    dfend.append(dfgrouped)

有人可以帮助我吗?

多谢

标签: pythonpandasdataframewhere-clause

解决方案


merge'shop' 上的两个 DataFrame。然后,您可以检查日期条件,between用于过滤到计数的行。最后groupby+ sum。(这假设您的第二个 df 是唯一的)

m = df2.merge(df1, how='left')

(m[m['date'].between(m['start'], m['stop'])]
   .groupby(['shop', 'start', 'stop'])['sell'].mean()
   .reset_index())

#  shop  start  stop  sell
#0    a   2000  2001   111
#1    a   2000  2002   174
#2    b   2000  2000    55

如果其中的某些行在 中df2没有符合条件的行df1,则改为使用mask,以便它们在 之后仍然得到一行(这也是合并中左侧 DataFramegroupby的原因)。df2在这里我添加了一个额外的行

print(df2)
#  shop  start  stop
#0    a   2000  2002
#1    a   2000  2001
#2    b   2000  2000
#3    e   1999  2011

m = df2.merge(df1, how='left')

(m.where(m['date'].between(m['start'], m['stop']))
  .groupby([m.shop, m.start, m.stop])['sell'].mean()
  .reset_index())

#  shop  start  stop   sell
#0    a   2000  2001  111.0
#1    a   2000  2002  174.0
#2    b   2000  2000   55.0
#3    e   1999  2011    NaN

推荐阅读