【问题标题】:Calculate average date difference of multiple rows计算多行的平均日期差
【发布时间】:2018-03-14 03:05:51
【问题描述】:

我需要计算dataGridView中所有行的日期差的平均值。

我实现了 NodaTime(这比计算日期差的传统方法要容易得多),我这样做只是为了尝试:

var date1 = new LocalDate(2013, 1, 29);
var date2 = new LocalDate(2018, 1, 23);
Period period = Period.Between(date1, date2.PlusDays(1));
label1.Text = string.Format("{0} anos, {1} meses e {2} dias", period.Years, 
period.Months, period.Days);

现在,我如何获取dataGridView 的两个日期,计算每一行的日期差异并计算平均值?我希望它以年、月和日的形式显示出来。谢谢。

【问题讨论】:

  • 相邻行还是任意两行?
  • 我的意思是,计算每行2列的日期差
  • 如有需要,请随时编辑问题
  • @TiagoCaldeira 所以你基本上想计算两个日期时间之间的日期差?
  • 有道理,但我不知道如何实现。基本上我想看看一篇文章从存储中移出需要多少时间(例如)编辑:只是看了你附加了一些链接,会检查出来!

标签: c# winforms nodatime


【解决方案1】:

不幸的是,没有关于平均 Period 值的真正概念,因为它们甚至没有直接可比性。例如,“1 个月”比“29 天”长还是短?这取决于月份。移动到平均值,“1 个月”和“29 天”这两个时期分别是多少? IMO,对于这个问题,没有什么非常明显的有用答案。

可以做的就是在几天内得到差异(可能使用Period.Between 并指定PeriodUnits.Days) - 然后找到平均天数。 合乎逻辑,并且比年/月/日的平均值更容易定义。

【讨论】:

    【解决方案2】:

    我必须为我们的一个项目解决类似问题。我敲了下面的代码 sn-p 似乎可以工作。

    假设您在表单上有一个用于此测试的网格。

    将日期添加到您的网格列。我将第 0 列和第 1 列用于 2 个日期。

    private void Form1_Load(object sender, EventArgs e)
    {
            dgGridView.Rows.Add(new DataGridViewRow());
            dgGridView.Rows.Add(new DataGridViewRow());
            dgGridView.Rows.Add(new DataGridViewRow());
    
            dgGridView.Rows[0].Cells[0].Value = "Feb 01 2018 00:00:00";
            dgGridView.Rows[0].Cells[1].Value = "Feb 03 2018 06:00:45";
            dgGridView.Rows[1].Cells[0].Value = "Feb 02 2018 17:00:00";
            dgGridView.Rows[1].Cells[1].Value = "Feb 03 2018 21:54:21";
            dgGridView.Rows[2].Cells[0].Value = "Feb 04 2017 10:00:00";
            dgGridView.Rows[2].Cells[1].Value = "Feb 07 2018 08:23:26";
    }
    

    在按钮单击或您选择的任何机制下,计算平均值。这是通过计算每个日期范围之间经过的秒数然后除以行数来完成的。

    var totalSeconds = 0.0;
    
     foreach (DataGridViewRow row in dgGridView.Rows)
     {
        var date1 = Convert.ToDateTime(row.Cells[0].Value);
        var date2 = Convert.ToDateTime(row.Cells[1].Value);
        var diff = (date2 - date1).TotalSeconds;
    
        row.Cells[2].Value = diff;
        totalSeconds += diff;
    }
    
    var totalRows = 3;
    var aveSeconds = totalSeconds / totalRows;
    
    TimeSpan aveTime = TimeSpan.FromSeconds(aveSeconds);
    
    var totDays = aveTime.Days;
    var totHours = aveTime.Hours;
    var totMins = aveTime.Minutes;
    var totSeconds = aveTime.Seconds;
    
    var ave = $"Days:{totDays} Hours:{totHours} Mins:{totMins} Seconds:{totSeconds}";
    

    然后,您可以从这些总秒数中获取一个 TimeSpan 对象,并提取平均天数、小时数、分钟数和秒数。

    我认为这行得通。如果某些目光敏锐的人发现了缺陷,请提前道歉,但我希望它对您有所帮助。

    谢谢

    【讨论】:

    • 这看起来很有希望,实际上可以工作,但我想要几年、几个月和几天,时间并不重要..
    • @TiagoCaldeira - 那么如果天数 >= 365 那么我猜你可以解释年份?
    • 它部分工作是的,但我想要准确的结果,而不仅仅是除以 365
    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2018-05-01
    • 2022-08-21
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多