我试图理解如何使用LINQ按时间间隔对数据进行分组;然后理想地聚集每组。
我发现了大量具有明确日期范围的示例,我尝试按时间段进行分组,如5分钟、1小时、1天。
例如,我有一个类,它用一个值 Package DateTime:
public class Sample
{
public DateTime timestamp;
public double value;
}
这些观测作为一个系列包含在List集合中:
List<Sample> series;
因此,要按小时时间段分组并按平均值合计值,我将尝试执行以下操作:
var grouped = from s in series
group s by new TimeSpan(1, 0, 0) into g
select new { timestamp = g.Key, value = g.Average(s => s.value };
这是一个根本性的缺陷,因为它将TimeSpan本身分组。我不明白如何在查询中使用TimeSpan(或任何表示间隔的数据类型)。
9条答案
按热度按时间mepcadol1#
您可以将时间戳舍入到下一个边界(即,向下舍入到过去最接近的5分钟边界),并将其用作您的分组:
以上通过在分组中使用修改的时间戳来实现这一点,该修改的时间戳将分钟设置为前5分钟边界并移除秒和毫秒。当然,相同的方法可用于其他时间段,即小时和天。
编辑:
基于该补充样本输入:
为我生成了3个组,一个组的时间戳为3:05,一个组的时间戳为3:10,一个组的时间戳为3:20 pm(您的结果可能会因当前时间而异)。
5vf7fwbs2#
我很晚才开始这个游戏,但我在寻找其他东西的时候遇到了这个,我想我有一个更好的方法。
下面是一个linqpad示例程序,您可以验证和测试它
g2ieeal73#
要按小时分组,您需要按时间戳的小时部分分组,具体操作如下:
0ejtzxu14#
我建议使用new DateTime()来避免任何亚毫秒级差异问题
与
注意:我在这里按作者ID和四舍五入的时间戳分组。
取整函数取自@dtb此处应答https://stackoverflow.com/a/7029464/661584
了解精确到毫秒的相等在这里并不总是相等Why does this unit test fail when testing DateTime equality?
xxls0lw85#
我改进了BrokenGlass的答案,使其更加通用,并增加了安全措施。对于他目前的答案,如果你选择间隔9,它将不会像你所期望的那样。任何数字60都不能被整除也是如此。在这个例子中,我使用9,从午夜(0:00)开始。
对我来说,这是一个巨大的问题。
我不知道该怎么解决,但你可以增加安全措施。
变更:
1.小时间隔也可以。
在select语句中输入你想输入的内容!我输入min/max是因为这样更容易测试。
wtzytmuj6#
尽管我真的迟到了,这里是我的两分钱:
我想以5分钟为间隔将时间值上下舍入():
这可以通过转换为TimeSpan.Tick并转换回DateTime,然后使用Math.Round()来实现:
shiftedTimeStamp可用于如上所示的链接分组。
kdfy810k7#
我知道这并不能直接回答这个问题,但我在Google上四处搜索,寻找一个非常类似的解决方案,以聚合股票/加密货币的蜡烛数据,从一个较小的分钟周期到一个较高的分钟周期(5,10,15,30)。你不能简单地从当前的一分钟回到X,因为聚合周期的时间戳不一致。您还必须注意列表的开始和结束处是否有足够的数据来填充较大周期的完整烛台。鉴于此,我提出的解决方案如下所示。2(它假设较小周期的蜡烛,如rawPeriod所示,按时间戳升序排序。3)
46qrfjad8#
通用解决方案:
基于问题的测试(使用AutoFixture库)
kr98yfug9#
如果BrokenGlass版本不起作用,那么您的值中也可能有勾号。以下是一个工作版本: