我有一个保存记录的数据库,这些记录有一个日期时间。作为请求,我建立了一个时间表来显示全年每天每小时记录的记录数。
所以,为此,我只按小时分组并计算每个小时内的对象数量:
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; }
}
答案 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
>小时组2
,1: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();