【问题标题】:How to calculate an average profit per day with Google Sheets如何使用 Google 表格计算每天的平均利润
【发布时间】:2021-04-12 16:50:54
【问题描述】:

我制作了一个电子表格来跟踪我的收入增长。它包括一个脚本,可以定期保存我所获得的。 A 列是日期,B 列是多少。

我想计算我的每日平均利润。

所以我从昨天到今天进行了减法,然后对所有数据取平均值。但在此过程中出现了一个问题,因为我的脚本每天会多次保存数据(以确保我获得数据,并更精确地跟踪)。

  • 我想先分别计算每天的平均利润(屏幕截图上的 C 列)
  • 然后计算变化(屏幕截图上的 D 列)
  • 然后平均变化。 (屏幕截图上的 E 列)

随着我的数据每天都在增长,我正在寻找一种灵活的方式来实现这一目标。我认为QUERY可能是一种方式,但我不知道该怎么做。我猜一个脚本也可以工作。也许使用 FILTER 公式...

您对此有何看法? 干杯, NipthiAe。

【问题讨论】:

  • 这很难用公式来解决。使用 Apps 脚本可以吗?
  • 是的,我会没事的,我也在寻找查询,但这对我来说很难。
  • 顺便问一下,它们总是按顺序排列的吗?
  • 按日期排序。每天大约有 4 条新行来保持数据更新。
  • 所以,是的,它总是按顺序排列的,抱歉。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

要计算每日利润,您不应该对每次的投资组合进行平均。例如,如果您在一天内拥有

Portfolio
1
2
3
4

平均值为2.4,但这不是当天的利润。要计算一天的利润,您需要用前一天的最后一个值减去当天的最后一个值。在这种情况下,如果最后一个值为 0,则答案为 4。

我会这样做。

解决方案

第一步:在收盘时找出组合的价值

我们需要做的是找到每天的最新值。最简单的方法是查找当天的最后一个条目(使用日期时间)。因此,要获取我们可以使用的最后一个日期时间(在我的情况下将其添加到 D2):

=query({A3:A, arrayformula(int(A3:A))}; "select max(Col1) where Col1 is not null group by Col2 label max(Col1) ''"; 0)

让我们解开这个公式:

{A3:A, arrayformula(int(A3:A))}

这是一个 2 列数组。第一列是日期时间。第二列只是日期。这取决于int(datetime) 返回代表当天的数字这一事实。添加arrayformula 以获取每个日期时间的日期,然后您将获得每个日期时间的日期。

然后查询:

select max(Col1)
  where Col1 is not null
  group by Col2
  order by max(Col1)
  label max(Col1) ''

这里的诀窍是在一天内获得最大(最新)的日期时间。这可以通过选择max(datetime) 并按日期分组来实现。然后我们可以为空单元格添加一个过滤器(where Col1 is not null)并对结果进行排序以确保正确的排序。还可以通过在末尾添加label max(Col1) '' 来删除默认标签。

第 2 步:获取最后一个值

现在我们有了一天中的最后一个日期时间,我们可以使用vlookup 来获取值(在E3):

=arrayformula(if(D3:D<>""; vlookup(D3:D; A3:B; 2; false); ""))

如您所见,这是一个简单的vlookup,它被包裹在if 中,以防止在空单元格上出现错误。 arrayformula 允许我们在一个公式中为每一行执行此操作。

第 3 步:获取每日利润

现在我们有了最新的值,我们只需要减去前一行(在F3上):

=arrayformula(if(E3:E100<>""; E3:E-offset(E3:E; -1; 0); ""))

offset 允许我们使用这个公式而不必指定行数。与往常一样,arrayformula 允许我们对单个公式中的所有行执行此操作,并过滤空行。

第 3 步:总平均数

我们终于可以取平均值了:

=average(F3:F)

如果您不是从 0 开始,则应将其更改为从下一个值 (F4) 开始,因为第一个值将累积到该点为止。

参考文献

【讨论】:

  • 哇!没想到这么精准!另外,它使我的每日平均水平比以前更多!谢谢!!
【解决方案2】:

你可以用 3 个公式做到这一点:

D2中的第一个(查询):

获取每天的平均值

=query({A2:B}, 
   "Select Col1 ,count(Col1), avg(Col2) where Col1 is not null 
        group by Col1 Order By Col1 asc 
           label Col1 'Date', count(Col1) 'Days', avg(Col2) 'Average/day'")

第二名G4

要获得查询获得的平均值之间的差异:

=arrayformula(if(isblank(E4:E6),"",filter(E4:E6,E4:E6>-1)-filter(E3:E6,E3:E6>-1)))

F1 中的第三个(查询上方):

要获得变化的平均值:

="Variation Avg: "& DOLLAR(round(AVERAGE(F3:F),2))

【讨论】:

  • 我的 D 列有问题:在您的屏幕截图上按日期显示一行,但在我的电子表格中,每个盘中都有一行。我想像你一样平均,如果可能的话,我希望它与原始日期的行在同一行。
  • 谢谢你,我已经找到了自己的路!这是值得的!再次感谢您的帮助!
  • 不客气。如果您想要演示表,请告诉我。我已经更新了我的答案,包括每个日期的天数,这可能很有用。我不太相信您要寻找的格式。
猜你喜欢
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多