2016-03-02 70 views
1

我有日期的列表,該範圍從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.1

+0

所以你正在尋找一年的一週? –

+0

在這裏,你可以找到如何獲得一週 http://stackoverflow.com/questions/11154673/get-the-correct-week-number-of-a-given-date – Valentin

+0

我已經將日期轉換爲ISO格式儘管在這個問題上很清楚正在使用什麼格式,但使用國際標準避免模棱兩可的情況仍然是SO的良好做法。 – Enigmativity

回答

4

這是相當直截了當制定出你所需要的,但最複雜的是要計算出你正在看的一年中的哪一週。 .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」。

+0

我添加了一個編輯,我想將日期劃分爲大約25周,每個日期從最早的日期開始到最後的日期。 – Sewder

+0

@Sewder - 我已經更新了答案。 – Enigmativity

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() 
}); 
+0

我會結合這與LINQ。像groupedDates = myDateList.GroupBy(d => myCalendar.GetWeekOfYear(d))。然後,您可以獲得每個組的計數,並根據需要以其他方式繼續處理。 – JamesFaix

+0

@Sewder:更新的答案 –

+0

@JamesFaix:更新的答案 –

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); 
} 
+0

我需要重新回答我的答案,但考慮到最早的日期是2015年7月20日,直到1月14日纔有26個星期。那就是我希望每個日期時間分組,26周。這可能嗎? – Sewder

+0

@Sewder - 您可以使用您希望的任意星期組合預先初始化柱狀圖「桶」(每個組合初始化爲零)。 –