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

GroupBy Hour then Average between two points

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

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

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.. 然后在 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; }
}

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

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

如果您希望时间转到最近的 half-hour 组(例如:1:50 > 小时组 21:35 > 小时组 1.5),然后像这样分组:

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