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.. 然后在 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();
这样,0 到 29 分钟之间的所有时间都将转到小时组(例如:1:20
转到小时组 1
),而 30 到 59 之间的时间将转到half-hour 组(例如:1:40
进入 1.5
小时组)。
如果您希望时间转到最近的 half-hour 组(例如:1:50
> 小时组 2
、1: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();
我有一个保存记录的数据库,这些记录有一个日期时间。应要求,我建立了一个时间线来显示全年每天每个小时记录了多少条记录。
因此,为此我简单地按小时分组并计算每个小时内的对象数量:
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();
这样,0 到 29 分钟之间的所有时间都将转到小时组(例如:1:20
转到小时组 1
),而 30 到 59 之间的时间将转到half-hour 组(例如:1:40
进入 1.5
小时组)。
如果您希望时间转到最近的 half-hour 组(例如:1:50
> 小时组 2
、1: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();