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条记录。。没有得到正确的计数,我做错了什么。。。