按周拆分数据

本文关键字:数据 拆分 周拆分 | 更新日期: 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));