C# 使用LINQ C按小时间隔聚合值

C# 使用LINQ C按小时间隔聚合值,c#,linq,aggregate-functions,C#,Linq,Aggregate Functions,我从API获得了以下JSON结果 [ { "ID": "1", "Value" : "10", "TimeStamp": "2019-10-21 00:00:00" }, { "ID": "1", "Value": "10", "TimeStamp": "2019-10-21 00:15:00" }, { "ID": "1",

我从API获得了以下JSON结果

[
    {
        "ID": "1",
        "Value" : "10",
        "TimeStamp": "2019-10-21 00:00:00"

    },
    {
        "ID": "1",
        "Value": "10",
        "TimeStamp": "2019-10-21 00:15:00"

    },
    {
        "ID": "1",
        "Value": "10",
        "TimeStamp": "2019-10-21 00:30:00"
    },
    {
        "ID": "1",
        "ResultValue": "10",
        "TimeStamp": "2019-10-21 00:45:00"
    },
    {
        "ID": "1",
        "Value": "20",
        "TimeStamp": "2019-10-21 01:00:00"

    },
    {
        "ID": "1",
        "Value": "10",
        "TimeStamp": "2019-10-21 01:15:00"

    },
    {
        "ID": "1",
        "Value": "10",
        "TimeStamp": "2019-10-21 01:30:00"
    },
    {
        "ID": "1",
        "Value": "10",
        "TimeStamp": "2019-10-21 01:45:00"
    },
    {
        "ID": "1",
        "Value": "30",
        "TimeStamp": "2019-10-21 02:00:00"
    }
]
我试图使用下面的LINQ查询显示每小时的聚合

结果是

  ID : 1
    TotalValue : 40
    TimeStamp : 21.10.2019 00:00:00

    ID : 1
    TotalValue : 50
    TimeStamp : 21.10.2019 01:00:00
<> P>我的LINQ查询应该是什么,如果我想每小时聚合考虑第十五分钟而不是零分钟。 就像第一个小时应该有

2019-10-21 00:15:00 - 10
2019-10-21 00:30:00 - 10
2019-10-21 00:45:00 - 10
2019-10-21 01:00:00 - 20
而预期的结果应该是

您可以移动时间戳以获得效果。而不是

items.GroupBy(u => new { u.ID, u.TimeStamp.Date, u.TimeStamp.Hour })
您将过去用于分组的时间改为15分钟,因此一小时前15分钟的所有内容都将转到较早的一小时

items.GroupBy(u => new { u.ID, u.TimeStamp.AddMinutes(-15).Date, u.TimeStamp.AddMinutes(-15).Hour })
您可以移动时间戳以获得效果。而不是

items.GroupBy(u => new { u.ID, u.TimeStamp.Date, u.TimeStamp.Hour })
您将过去用于分组的时间改为15分钟,因此一小时前15分钟的所有内容都将转到较早的一小时

items.GroupBy(u => new { u.ID, u.TimeStamp.AddMinutes(-15).Date, u.TimeStamp.AddMinutes(-15).Hour })
<如果我想每小时聚集考虑第十五分钟而不是零分钟。你可以在一小时内增加15分钟,然后再分组

public class ApiResult
{
    public int ID { get; set; }
    public int Value { get; set; }
    public DateTime TimeStamp { get; set; }
}

var result = JsonConvert.DeserializeObject<IList<ApiResult>>(File.ReadAllText("../../../data.json"));

var AggValues = result.GroupBy(x => new
{
    x.ID,
    x.TimeStamp.AddMinutes(15).Date,
    x.TimeStamp.AddMinutes(15).Hour,
    x.Value
}).Select(x => new ApiResult
{
    ID = x.Key.ID,
    TimeStamp = x.Key.Date.AddHours(x.Key.Hour),
    Value = x.Sum(sum => sum.Value)
});

foreach(var i in AggValues)
{
    Console.WriteLine(i.ID + " " + i.Value + " " + i.TimeStamp);
}
<如果我想每小时聚集考虑第十五分钟而不是零分钟。你可以在一小时内增加15分钟,然后再分组

public class ApiResult
{
    public int ID { get; set; }
    public int Value { get; set; }
    public DateTime TimeStamp { get; set; }
}

var result = JsonConvert.DeserializeObject<IList<ApiResult>>(File.ReadAllText("../../../data.json"));

var AggValues = result.GroupBy(x => new
{
    x.ID,
    x.TimeStamp.AddMinutes(15).Date,
    x.TimeStamp.AddMinutes(15).Hour,
    x.Value
}).Select(x => new ApiResult
{
    ID = x.Key.ID,
    TimeStamp = x.Key.Date.AddHours(x.Key.Hour),
    Value = x.Sum(sum => sum.Value)
});

foreach(var i in AggValues)
{
    Console.WriteLine(i.ID + " " + i.Value + " " + i.TimeStamp);
}

相关的:相关的:这班从一天的前15分钟到当天的23小时,而它实际上应该属于前一天。这班从一天的前15分钟到当天的23小时,而它实际上应该属于前一天。
1 30 2019-10-21 00:00:00
1 0 2019-10-21 01:00:00
1 20 2019-10-21 01:00:00
1 20 2019-10-21 01:00:00
1 10 2019-10-21 02:00:00
1 30 2019-10-21 02:00:00