按周拆分数据
本文关键字:数据 拆分 周拆分 | 更新日期: 2023-09-27 18:00:06
我有一个具有时间戳的数据对象:
class MyDataObject
{
public DateTime timestamp { get; set; }
public int value { get; set; }
public MyDataObject(DateTime timestamp, int value)
{
this.timestamp = timestamp;
this.value = value;
}
}
在主要方法中,我在18天(2.5周)的时间跨度内创建了很多这样的数据对象:
static void Main(string[] args)
{
List<MyDataObject> data = new List<MyDataObject>();
data.Add(new MyDataObject(DateTime.Now, 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(2), 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(4), 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(6), 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(8), 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(10), 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(12), 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(14), 1));
data.Add(new MyDataObject(DateTime.Now.AddDays(18), 1));
}
我需要将这些数据除以周,这样第1天到第6天的数据需要放在一个数组中,第8天到第14天的数据放在另一个数组,第18天的数据单独放在另个数组中。
我需要创建一个某种类型的2D列表,并以某种方式将数据划分为"数组数组",但我被难住了。我怀疑我需要使用List.FindAll,但我以前从未使用过它,也不知道在这种情况下如何使用它。
假设您可以使用LINQ,您只需要以下内容:
var groupedByWeek = data.GroupBy(item => GetStartOfWeek(item.timestamp));
其中GetStartOfWeek
将在给定周开始时返回DateTime
,例如
public static DateTime GetStartOfWeek(DateTime value)
{
// Get rid of the time part first...
value = value.Date;
int daysIntoWeek = (int) value.DayOfWeek;
return value.AddDays(-daysIntoWeek);
}
这将给你一个以周日为基础的一周。你需要稍微调整一下,以考虑从周六、周一或其他时间开始的一周。
您要做的第一件事是获取给定时间戳的周数。GetWeekOfYear
方法就是这样设计的。使用LINQ的GroupBy
扩展方法,将列表划分为不同的周非常容易。
using System.Globalization; // for Calendar
using System.Linq; // for GroupBy
...
DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar
var groups = data.GroupBy(x => cal.GetWeekOfYear(
x.timestamp, dfi.CalendarWeekRule, dfi.FirstDayOfWeek));