Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按小时分组,然后在两点之间取平均值_C#_Dotnethighcharts - Fatal编程技术网

C# 按小时分组,然后在两点之间取平均值

C# 按小时分组,然后在两点之间取平均值,c#,dotnethighcharts,C#,Dotnethighcharts,我有一个保存记录的数据库,这些记录有一个日期时间。作为一项请求,我建立了一个时间表来显示全年每天每小时记录了多少条记录 因此,我简单地按小时分组,并计算每个小时内的对象数量: var lstByHour = lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted) .GroupBy(x => x.RecordDateTime.Hour) .Sele

我有一个保存记录的数据库,这些记录有一个日期时间。作为一项请求,我建立了一个时间表来显示全年每天每小时记录了多少条记录

因此,我简单地按小时分组,并计算每个小时内的对象数量:

var lstByHour =
    lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
        .GroupBy(x => x.RecordDateTime.Hour)
        .Select(x => new object[] {x.Count()}).ToArray();
我正在使用这些信息将其放入折线图中,下面是它的外观:

但是现在,我被要求得到半小时的时间。。或者是每小时之间的点。。所以我想的是取两个点,求出平均值,这将得到两个点之间的中间值。例如在
0
小时,该点为35。。在
1
小时,该点为41。。为了找到中间的数字,我只需要加35+41=76/2=38。。然后在
0
1
小时之间绘制38。在奇数除以2并以小数结束的情况下。。我想总结一下

我的问题是,我不确定从哪里开始编辑lambda表达式以获得该值。。并在每小时之间连续获取该值

感谢您的帮助

更新

使用重复的问题,我对我的代码将如何获得30分钟的间隔感到困惑。我有这个:

var groups = lstAllRecords.GroupBy(x =>
    {
        var stamp = x.RecordDateTime;
        stamp = stamp.AddMinutes(-(stamp.Minute % 30));
        stamp = stamp.AddMilliseconds(-stamp.Millisecond - 1000 * stamp.Second);
        return stamp;
    })
    .Select(g => new object[] {g.Count()})
    .ToArray();
这导致超过6000条记录,而折线图未加载

更新2

我已经尝试了被接受的答案和第二个答案,因为他们都有5分钟的间隔,这对我不起作用

var grouped = from s in lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
              group s by new DateTime(s.RecordDateTime.Year, s.RecordDateTime.Month,
                    s.RecordDateTime.Day, s.RecordDateTime.Hour, s.RecordDateTime.Minute / 2, 0) into g
              select new object[]{ g.Count() };
这是我的数据模型

public partial class DailyRecord
{
    public int ID { get; set; }
    public System.DateTime RecordDateTime { get; set; }
    public string IncidentNumber { get; set; }
    public string Summary { get; set; }
    public bool deleted { get; set; }
}

如果我理解正确,您希望数据按小时分组,但每个组的开始和结束时间为半小时(例如,一个组包含08:30到09:30之间的数据)

如果这是您想要的,那么类似的东西应该可以工作:

var lstByHour =
    lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
        .GroupBy(x => {return x.RecordDateTime.Minutes > 30 ? x.RecordDateTime.Hour + 1 : x.RecordDateTime.Hour})
        .Select(x => new object[] {x.Count()}).ToArray();
查看您的评论后编辑

这应该是半小时的分组

var lstByHour =
    lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
        .GroupBy(x => {return x.RecordDateTime.Minutes > 30 ? x.RecordDateTime.Hour + 0.5 : x.RecordDateTime.Hour})
        .Select(x => new object[] {x.Count()}).ToArray();

您可以这样分组:

lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
    .GroupBy(x => x.RecordDateTime.Hour + (x.RecordDateTime.Minute >= 30 ? 0.5 : 0))
    .Select(x => new object[] { x.Count() }).ToArray();
lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
    .GroupBy(x => x.RecordDateTime.Hour + (Math.Round(x.RecordDateTime.Minute / 30f, MidpointRounding.AwayFromZero) / 2))
    .Select(x => new object[] { x.Count() }).ToArray();
这样,0到29分钟之间的所有时间都将进入小时组(例如:
1:20
进入小时组
1
),30到59分钟之间的时间将进入半小时组(例如:
1:40
进入
1.5
小时组)

如果您想让时间转到最近的半小时组(例如:
1:50
>小时组
2
1:35
>小时组
1.5
),请按如下方式分组:

lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
    .GroupBy(x => x.RecordDateTime.Hour + (x.RecordDateTime.Minute >= 30 ? 0.5 : 0))
    .Select(x => new object[] { x.Count() }).ToArray();
lstAllRecords.Where(x => x.RecordDateTime.Year == year && !x.deleted)
    .GroupBy(x => x.RecordDateTime.Hour + (Math.Round(x.RecordDateTime.Minute / 30f, MidpointRounding.AwayFromZero) / 2))
    .Select(x => new object[] { x.Count() }).ToArray();

数据是如何存储的?每分钟都有数据吗?每小时?@Mikemcaughan,当用户的记录可以选择日期、小时和分钟时。。没有第二,我只是不分组,并使用您的图表工具显示每半小时的增量。。。假设你的图表工具可以做到这一点(没有关于你在那里使用什么的标签或信息)。@MikeMcCaughan对此表示抱歉。。我已经添加了必要的标记,它是highcharts,但我正在后端创建图表。。不在Javascript中。请使用
g.Count()
而不是
g.Average()
,因为根据原始代码,这显然是您想要的…实际上,我希望我的数据按半小时的增量分组。好的,所以我使用了第一个建议。。而且它正在按预期工作。。我只是想确保我理解正确。。现在举个例子。。在
0
小时,我数到了19。。这意味着0000到0029之间的所有记录。。然后在
0.5
上,我有一个20的计数。。这意味着0030和0059之间的所有记录。。然后在
1
上,我数到了142。。这就是0100到0129之间的所有记录?我想我的问题是。。当我按小时分组时。。小时数
0
为35。。但在你的回答中,19+20=39@GTown-编码员,我不知道怎么会发生。也许值得再次检查一下,你是在完全相同的数据上这样做的(按小时和按半小时)。你不认为按半小时这样做是可能的吗?@GTown Coder我的意思是,我不明白按小时分组如何在0小时返回35,但按半小时分组可以返回19+20。但是按半小时分组当然是可能的,正如答案中所描述的:)而且你对其工作原理的理解是正确的。好的,我现在在数据库中。。我从[DataBaseName].[dbo].[DailyRecord]中选择了*,其中年份(RecordDateTime)=2017,删除=0,日期部分(HOUR,RecordDateTime)=00。。这就返回了70条记录。。没有得到正确的计数,我做错了什么。。。