如何将日期列表分成几周

时间:2016-03-02 22:34:06

标签: c# winforms

我有一份日期列表,范围从2015年7月到2016年1月

2015/07/20 14:15:23 
2015/07/20 14:16:06 
2015/07/26 23:39:15 
2015/09/02 22:51:46 
2015/09/02 22:52:33 
2015/10/26 20:42:23 
2015/11/12 14:54:31 
2015/11/30 06:49:10 
2015/12/02 10:18:17 
2015/12/10 08:34:53 
2015/12/10 15:15:33 
2015/12/15 06:43:32 
2015/12/29 02:55:01 
2016/01/12 19:46:45 
2016/01/13 07:31:14 
2016/01/13 07:32:59 
2016/01/14 05:28:33 

我想把它们分成几个星期,所以我确切知道已经过了多少个星期,并为每个小组计算。我从Web服务中提取日期并将它们放入datagridview中。

我要添加一个名为week的列,我无法添加每个属于的周。

if (SplitChkBox.Checked == true)
{
    column = new DataColumn();
    column.DataType = System.Type.GetType("System.String");
    column.ColumnName = "Week";
    table.Columns.Add(column);
}

最终,我会根据每周有多少个实例创建一个图表。

谢谢!

修改

距离2015/07/20大约有25周,直到2016/01/14。我希望返回1-25,如果超过0,则返回属于该组的周数。

3 个答案:

答案 0 :(得分:5)

找出你需要的东西是相当直截了当的,但最复杂的是弄清楚你一年中的哪一周。 .NET框架通过提供许多不同的日历来帮助您,包括许多不是Gregorian的日历。您很可能只需使用CultureInfo.CurrentCulture.DateTimeFormat.Calendar来获取日历。

然后你可以这样做:

var results =
    dates
        .GroupBy(x => CultureInfo.CurrentCulture.DateTimeFormat.Calendar
            .GetWeekOfYear(x, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
        .SelectMany(gx => gx, (gx, x) => new
        {
            Week = gx.Key,
            DateTime = x,
            Count = gx.Count(),
        });

请注意,周数基于CalendarWeekRule&的两个额外参数。 DayOfWeek。您可以为第一个参数选择FirstDay, FirstFourDayWeek, FirstFullWeek,为第二个参数选择一周中的任何一天。

我已使用.SelectMany展平结果以及您如何获取周数和计数,但您可能需要以不同的格式生成数据,但这应该有所帮助尽管如此。

以下是我得到的结果:

results

根据您的编辑,可以很容易地创建一个从最早的日期开始按周分组的查询。

var firstDay = dates.Min().Date;

var results =
    dates
        .GroupBy(x => x.Date.Subtract(firstDay).Days / 7 + 1)
        .SelectMany(gx => gx, (gx, x) => new
        {
            Week = gx.Key,
            DateTime = x,
            Count = gx.Count(),
        });

我现在得到这个结果:

result

我不明白你的意思"如果它超过0&#34,则计算该组属于多少个星期。

答案 1 :(得分:1)

如果您想要一年中的周数,可以使用Calendar类:

DateTime date = new DateTime(2015, 07, 20);

DateTimeFormatInfo dateTimeFormatInfo = DateTimeFormatInfo.CurrentInfo;  // Current culture-specific information about the format of date and time.          
Calendar calendar = dateTimeFormatInfo.Calendar;                         // Calendar used in current culture.

var weekOfYear = calendar.GetWeekOfYear(date,                                // The date
                                        dateTimeFormatInfo.CalendarWeekRule, // Rule for determining the first week of the year.
                                        dateTimeFormatInfo.FirstDayOfWeek);  // Day used as the first day of week

修改

您可以创建一个DateTime的扩展程序返回一周以便于使用:

public static class DateTimeExtensions
{
    public static int GetWeekOfYear(this DateTime date)
    {
        DateTimeFormatInfo dateTimeFormatInfo = DateTimeFormatInfo.CurrentInfo;
        Calendar calendar = dateTimeFormatInfo.Calendar;

        var weekOfYear = calendar.GetWeekOfYear(date,
                                                dateTimeFormatInfo.CalendarWeekRule,
                                                dateTimeFormatInfo.FirstDayOfWeek);

        return weekOfYear;
    }
}

使用GroupBy()对日期进行分组:

var dates = new DateTime[] { /* dates */ };

var groups = dates.GroupBy(d => d.GetWeekOfYear()).Select(g => new 
{
    Week = g.Key,
    Dates = g.ToArray(),
    Count = g.Count()
});

答案 2 :(得分:1)

你的意思是这样的(它做了一些简化的假设):

List<DateTime> DateList = new List<DateTime>();

DateList.Add(DateTime.Parse("7 / 20 / 2015 2:15:23 PM"));
DateList.Add(DateTime.Parse(" 7 / 20 / 2015 2:16:06 PM"));
DateList.Add(DateTime.Parse(" 7 / 26 / 2015 11:39:15 PM"));
DateList.Add(DateTime.Parse(" 9 / 2 / 2015 10:51:46 PM"));
DateList.Add(DateTime.Parse(" 9 / 2 / 2015 10:52:33 PM"));
DateList.Add(DateTime.Parse(" 10 / 26 / 2015 8:42:23 PM"));
DateList.Add(DateTime.Parse(" 11 / 12 / 2015 2:54:31 PM"));
DateList.Add(DateTime.Parse(" 11 / 30 / 2015 6:49:10 AM"));
DateList.Add(DateTime.Parse(" 12 / 2 / 2015 10:18:17 AM"));
DateList.Add(DateTime.Parse(" 12 / 10 / 2015 8:34:53 AM"));
DateList.Add(DateTime.Parse(" 12 / 10 / 2015 3:15:33 PM"));
DateList.Add(DateTime.Parse(" 12 / 15 / 2015 6:43:32 AM"));
DateList.Add(DateTime.Parse(" 12 / 29 / 2015 2:55:01 AM"));
DateList.Add(DateTime.Parse(" 1 / 12 / 2016 7:46:45 PM"));
DateList.Add(DateTime.Parse(" 1 / 13 / 2016 7:31:14 AM"));
DateList.Add(DateTime.Parse("1 / 13 / 2016 7:32:59 AM"));
DateList.Add(DateTime.Parse("1 / 14 / 2016 5:28:33 AM"));

Dictionary<int, int> MyHistogram = new Dictionary<int, int>();

foreach(DateTime MyDateTime in DateList)
{
    int Week = MyDateTime.DayOfYear / 7;

    if (MyHistogram.ContainsKey(Week))
        MyHistogram[Week]++;
    else
        MyHistogram.Add(Week, 1);
}