我有一张表,其中包含许多表示 Excel 序列日期的值。经过多次尝试比较字段失败后,我目前的方法是比较序列日期而不是日历日期。我试图用公式按天汇总数据。
考虑:
41021 some data
41021.625 some data
41021.63542 some data
41022 some data
41022.26042 some data
41022.91667 some data
41023 some data
41023.375 some data
期望结果:
41021 sum of 41021, 41021.625 and 41021.63542 data
41022 sum of 41022, 41022.26042 and 41022.91667 data
41023 sum of 41023 and 41023.375 data
本质上,对于 SerialDate.SerialTime 的所有实例,与 SerialDate.* 关联的 SUM 数据值,而不管该日期的 *.SerialTime 是什么。
虽然我可以看到如何通过创建额外的日期列格式来做到这一点,但=TEXT(<DateField>,"mm/dd/yyyy")
我正在寻找一种解决方案,使我能够处理公式中的这种“转换”,例如SUMIF((TEXT(<dateRange>,"yy/mm/dd"),=(TEXT(<dateField,"yy/mm/dd")),<dataRange>
有道理吗?有人有什么想法吗?
谢谢
答案1
假设你的序列时间在A列,相关数据在B列,则以下公式
=IF(INT($A1)=$A1,SUMIFS($B:$B,$A:$A,">="&$A1,$A:$A,"<"$A1+1),"")
将在 C1 中输入并扩展到列时,在 C 列中显示第一个整数时间值后面的总和。如果这就是您所需要的,那么您就完成了。
但是,如果你需要将所有总数一个接一个地放在一起,中间没有空行,那么你必须使用数组公式并插入一个额外的列作为参考标签。在 C 列中,选择包含数据的行中的单元格(即,如果您的数据填充了 1 到 100 行,请选择 C1 到 C100),然后在公式栏中插入以下公式(不要直接在单元格中插入!):
=IFERROR(SMALL(IF(INT($A1:$A100)=$A1:$A100,$A1:$A100,""),ROW()),"")
请注意,要使其正常工作,您需要将其保存为数组公式通过使用Ctrl+Shift+Enter(不是Enter- 如果您输入正确,公式将显示在括号中)确认您的公式输入。您还必须根据需要调整范围,因为公式对空单元格返回 0。最后,请注意数组公式在大型数据集上会变得相当慢。ooo...o...o...w。
完成后,您可以添加
=IF($C1<>"",SUMIFS($B:$B,$A:$A,">="&$A1,$A:$A,"<"$A1+1),"")
到 D 列,你就得到了:
答案2
如果您尝试按天汇总数据(或获取每日小计),则可以尝试此数组公式。在公式栏中输入此公式,然后按Ctrl+ Shift+ Enter。:
=SUM((INT(datetimes)=D3)*somedata)
在哪里
datetimes
包含您的序列日期,采用General
或mm/dd/yyyy h:mm
格式somedata
包含一些要添加的数字(下面示例中的 B2:B25)
Excel 将日期视为整数(序列值),将时间视为小数(24 小时的分数)。例如,06/01/2012 3:00:00 PM
等于41061.625
(如果您将单元格格式更改为General
),您将看到此值)。整数表示日期,而0.625
表示3:00 pm
或15:00
或15/24
。要提取 DATE 段,您可以使用INT(A1)
。
答案3
最简单的方法是使用 Excel(2007/2010)内置表格和数据透视表功能。
- 利用您的数据创建一个 Excel 表。
- 使用 Excel 的“INT”函数为日期创建一个辅助列,该函数会将所有值向下滚动到相应的日期(日期/时间字段的整数部分)。您还可以轻松地为字段的时间值创建一个辅助列。
- 使用数据表作为源创建数据透视表。
- 将行标签设置为辅助日期,将数据透视表值设置为数据点(并且可以将时间字段添加为列标签)。
然后,每当您更新表格时,您都可以刷新数据透视表以获取当前小计。作为奖励,您还可以选择任何其他聚合函数(最小值、最大值、平均值),并且可以选择以传统日期格式格式化数据透视表的标签,而不会影响数据表值。
如果您使用的是 Excel 2003,则可以使用列表功能(而不是表格)完成相同的操作。
示例 Excel 2010
示例 Excel 2003