我有一份日期列表,范围从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,则返回属于该组的周数。
答案 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
展平结果以及您如何获取周数和计数,但您可能需要以不同的格式生成数据,但这应该有所帮助尽管如此。
以下是我得到的结果:
根据您的编辑,可以很容易地创建一个从最早的日期开始按周分组的查询。
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(),
});
我现在得到这个结果:
我不明白你的意思"如果它超过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);
}