如何计算一组日期之间的间隔?

时间:2014-05-27 13:44:29

标签: c# .net algorithm datetime

数组中的每个日期都代表用户交互。 如果存在>的间隙在这些日期之间的20秒我计算一个新用户(让我们将这组日期称为会话)。 按照我的脚本,我可以正确计算用户数。

  • 但我无法计算会议的平均时间。

你能否指出我做错了什么,对于更好的代码的任何建议都非常受欢迎。感谢。

namespace test_code
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Clear();
            DateTime[] dates = {
                                new DateTime(2014,01,01,0,0,0),
                                new DateTime(2014,01,01,0,0,5),
                                new DateTime(2014,01,01,0,0,10), // 15 s USR 1 session

                                new DateTime(2014,01,01,0,5,0),
                                new DateTime(2014,01,01,0,5,5),  // 05 s USR 2

                                new DateTime(2014,01,01,0,10,0),
                                new DateTime(2014,01,01,0,10,1),
                                new DateTime(2014,01,01,0,10,2), // 03 s USR 3

                                new DateTime(2014,01,01,1,0,0), 
                                new DateTime(2014,01,01,2,0,0),
                                new DateTime(2014,01,01,2,0,20)  // 20 s USR 4
                            };


            int users = dates.Length > 0 ? 1 : 0;
            int gapS = 20; // Gap between date in seconds
            double totalTimeGaps = 0;
            double totalTime = 0;

            for (int i = 0, n = i + 1; i < dates.Length - 1; i++, n++)
            {
                totalTime += (dates[n] - dates[i]).TotalSeconds;
                if ((dates[n] - dates[i]).TotalSeconds > gapS)
                {
                    users++;
                    totalTimeGaps += (dates[n] - dates[i]).TotalSeconds; // Does not count properly
                    Console.WriteLine(totalTimeGaps);
                }
            }

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("Total Users: " + users);
            Console.WriteLine("Total Time Avg. Session : " + (totalTime - totalTimeGaps)/users);
            Console.ReadKey();
            Console.Clear();
        }
    }
}

编辑:工作脚本的最新版本

using System;

public class Program
{

public static void Main(string[] args)
        {

            DateTime[] dates = {
                                new DateTime(2014,01,01,0,0,0),
                                new DateTime(2014,01,01,0,0,5),
                                new DateTime(2014,01,01,0,0,10), // 10 s USR 1

                                new DateTime(2014,01,01,0,5,0),
                                new DateTime(2014,01,01,0,5,5),  // 05 s USR 2

                                new DateTime(2014,01,01,0,10,0),
                                new DateTime(2014,01,01,0,10,1),
                                new DateTime(2014,01,01,0,10,2), // 02 s USR 3

                                new DateTime(2014,01,01,1,0,0),  // 00 s USR 4

                                new DateTime(2014,01,01,2,0,0),
                                new DateTime(2014,01,01,2,0,20)  // 20 s USR 5
                            };


            int users = dates.Length > 0 ? 1 : 0;
            int gapS = 20; // Gap between date in seconds
            double totalTimeGaps = 0;
            double totalTime = 0;

            for (int i = 0, n = i + 1; i < dates.Length - 1; i++, n++)
            {
                double range = (dates[n] - dates[i]).TotalSeconds;  
                totalTime += range;

                if (range > gapS)
                {
                    users++;
                    totalTimeGaps += range;
                }
            }

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("Total Users: " + users);
            Console.WriteLine("Total Time Avg. Session : " + (totalTime - totalTimeGaps)/users);
            Console.WriteLine("Total Time App." + (totalTime - totalTimeGaps));
        }

}

3 个答案:

答案 0 :(得分:1)

我得到的结果与我在运行程序时的期望完全相同:

Total Users: 5
Total Time Avg. Session : 7.4

有五个用户的持续时间为10s,5s,2s,0s,20s。

因此,5个用户的总时间为37秒,平均为7.4秒/用户。

您的问题似乎不在代码中,而是在您自己对数据的理解中。您似乎没有注意到您记录为用户4的内容实际上是两个用户而您错误地计算了一些时间(似乎涉及三次时)。

根据您提供给我们的规范,您的代码是正确的,您只是错误地验证了代码。

答案 1 :(得分:1)

以下是为每个会话组使用一个List<DateTime>的另一种方法:

List<List<DateTime>> sessions = new List<List<DateTime>> { new List<DateTime>() };
foreach(DateTime dt in dates)
{
    if(!sessions.Last().Any())
        sessions.Last().Add(dt);
    else
    {
        TimeSpan diff = dt - sessions.Last().Last();
        if (diff.TotalSeconds > 20)
            sessions.Add(new List<DateTime> { dt });
        else
            sessions.Last().Add(dt);
    }
}

您可以对每个平均值使用List<double>

List<double> secondsPerSession = new List<double>();
foreach (var session in sessions)
{
    if (session.Count == 1)
        secondsPerSession.Add(0);
    else
    {
        double average = session.Skip(1)
            .Average(d => (d - session[0]).TotalSeconds);
        secondsPerSession.Add(average);
    }
}

输出:

for (int i = 0; i < sessions.Count; i++)
    Console.WriteLine("{0} [{1}]", 
        string.Join(",", sessions[i]), secondsPerSession[i]);

答案 2 :(得分:0)

问题在于你的周期状况。您只计算两个用户之间的总差距,而不是用户在系统中花费的总时间。看起来应该是这样的:

for (int i = 0, n = i + 1; i < dates.Length - 1; i++, n++)
{
    totalTime += (dates[n] - dates[i]).TotalSeconds;
    if ((dates[n] - dates[i]).TotalSeconds > gapS)
    {
        users++;
        Console.WriteLine(totalTimeGaps);
    }
    else
    {
        totalTimeGaps += (dates[n] - dates[i]).TotalSeconds; // Does not count       properly
    }
}

此外,如果您想在周期结束时获得平均值,您应该将总时间量除以用户总数。