GroupBy Hour然后两点之间的平均值

时间:2018-03-06 13:42:07

标签: c# dotnethighcharts

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

所以,为此,我只按小时分组并计算每个小时内的对象数量:

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

我正在使用这些信息放入折线图,这是看起来的样子:

enter image description here

但是现在,我被要求得到半小时......或者每小时之间的点...所以我想的是拿两分并找到平均值,这样就得到了中间数两点之间。例如..在0小时那个点是35 ..在1小时那个点是41 ..所以为了找到它们之间的数字,我只想加35 + 41 = 76/2 = 38 ..然后在01小时之间绘制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; }
}

2 个答案:

答案 0 :(得分:2)

您可以这样分组:

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();

这样,0到29分钟之间的所有时间都将转到小时组(例如:1:20转到小时1组),30到59之间的时间转到一半-hour组(例如:1:40转到1.5小时组)。

如果您希望有时间去最近的半小时组(例如:1:50>小时组21:35>小时组{{1然后像这样分组:

1.5

答案 1 :(得分:0)

如果我理解正确,您希望您的数据按小时分组,但每组开始和结束半小时(例如,一组包含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();