【问题标题】:Data Analysis in Time Interval时间区间的数据分析
【发布时间】:2014-05-24 01:30:01
【问题描述】:

我正在处理我最近为我的研究收集的大量数据。我想知道一天中用户活动发生的时间。这是我的数据集快照的一小部分:

我申请了以下代码以了解时间间隔登录活动。

=SUMPRODUCT(--(HOUR(I2:I185143)>=K4*24),--(HOUR(I2:I185143)<L4*24))

结果写在 N 列中。到目前为止,我相信一切都有效。但是我的问题是,如果我想每 10 分钟而不是每小时分析一次怎么办。

例如,8.00 am-8.10 am 之间发生了多少次登录。我目前查找every hour interval 的方法。如果你能在 excel 或 matlab 中帮助我,我会很高兴。

【问题讨论】:

标签: excel matlab datetime group-by time-series


【解决方案1】:

如果使用数组函数Frequency(),这在excel中相对简单

一些步骤:

我假设您想按每天的时间排序

所以时间列是data_array,频率的第一个参数(查看excel帮助)

对于 bin 数据,您必须获得一个以开始时间为开头的 添加以下每个 10 分钟以下的垃圾箱(= 1/24/6),使每天的第 6 个小时成为一天中的第 6 个小时

所以一整天总共有 144 个垃圾箱

然后选择 bin 旁边的列段并使用 =Frequency(data_array, bin_array) 对其进行数组编辑,并且不要忘记使用

输入它

【讨论】:

    【解决方案2】:

    好的,我在下面的截图中得到了答案。

    【讨论】:

      【解决方案3】:

      这是一个可能的 MATLAB 解决方案。

      1) 假数据

      为了测试我的代码,我首先必须生成一些与您的实际数据相似的假数据。处理真实数据时可以跳过此部分。

      len = 50;
      
      %# random dates inbetween these two
      dt_start = datenum('2013-06-22 19:17:00');
      dt_end = datenum('2013-06-22 19:23:00');
      dt = sort(dt_start + rand(len,1)*(dt_end-dt_start));
      
      %# create the columns
      ID = repmat(int32(104885), [len 1]);
      Date = cellstr(datestr(dt, 'mm/dd/yyyy'));
      Time = cellstr(datestr(dt, 'HH:MM:SS'));
      EE = rand(len,1);
      
      %# combine columns into a cell array
      C = [num2cell(ID), Date, Time, num2cell(EE)];
      
      %# create a "table" for convenience, and export to CSV file
      t = cell2table(C, 'VariableNames',{'ID', 'Date', 'Time', 'EE'})
      writetable(t, 'data.csv')
      
      %# cleanup
      clear len dt_start dt_end dt ID Date Time EE C t
      

      以下是我为本示例生成的数据的摘录:

      t = 
            ID          Date           Time          EE    
          ______    ____________    __________    _________
          104885    '06/22/2013'    '19:17:19'      0.95808
          104885    '06/22/2013'    '19:17:22'      0.72305
          104885    '06/22/2013'    '19:17:31'      0.86481
          104885    '06/22/2013'    '19:17:33'      0.52325
          .
          .
          104885    '06/22/2013'    '19:22:37'       0.5167
          104885    '06/22/2013'    '19:22:39'      0.53815
          104885    '06/22/2013'    '19:22:41'      0.27151
          104885    '06/22/2013'    '19:22:54'      0.37826
          104885    '06/22/2013'    '19:22:59'      0.51215
      

      2) 时间间隔中的频率计数

      我从 CSV 文件中读取数据,然后应用类似于您链接到的 the post 中使用的过程。在这种情况下,时间间隔长度是您可以指定的参数(10分钟间隔、1小时等)

      %# load data from CSV
      t = readtable('data.csv', 'Format','%d %s %s %f', 'Delimiter',',', ...
          'ReadVariableNames',true, 'FileType','text');
      
      %# convert date/time columns to serial date number
      dt = datenum(strcat(t.Date , {' '}, t.Time), 'mm/dd/yyyy HH:MM:SS');
      
      %# desired interval window-size (expressed in units of days).
      %# Here I am using a 2 minutes interval
      interval = 2/(24*60);    % (24 hours per day, 60 min per hour)
      
      % bin datetimes into specified intervals
      dt_binned = fix(dt/interval)*interval;
      
      % count frequencies in each interval
      [dt_unique,~,dt_unique_idx] = unique(dt_binned);
      counts = accumarray(dt_unique_idx, 1);
      freq = [cellstr(datestr(dt_unique)) num2cell(counts)]
      

      结果:

      freq = 
          '22-Jun-2013 19:16:00'    [ 7]
          '22-Jun-2013 19:18:00'    [21]
          '22-Jun-2013 19:20:00'    [12]
          '22-Jun-2013 19:22:00'    [10]
      

      所以我们在第一个时间间隔(从 19:16 到 19:18)发生了 7 个事件,在第二个事件发生了 21 个事件,依此类推。您可以轻松地调整代码以更改间隔长度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-06
        • 2019-07-15
        • 2016-07-24
        • 2017-04-22
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        相关资源
        最近更新 更多