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

本文关键字:之间 日期 一组 何计算 计算 | 更新日期: 2023-09-27 18:05:26

数组中的每个日期都代表一个用户交互。如果这些日期之间有> 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));
        }
}

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

我得到的结果与我运行程序时所期望的完全一致:

Total Users: 5
Total Time Avg. Session : 7.4

存在5个用户,其持续时间分别为10s、5s、2s、0s、20s

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

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

根据你给我们的规格,你的代码是正确的,你只是在错误地验证你的代码。

下面是为每个会话组使用一个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]);

问题出在你的自行车上。您只计算两个用户之间的总间隔,而不计算用户在您的系统中花费的总时间。它应该看起来像这样:

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
    }
}

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