找到事件的平均值或中位数

时间:2012-05-06 21:35:35

标签: matlab date

我有一个数据集,我已经提取了事件发生的日期。日期的格式为MMDDYY,虽然MatLab没有显示前导零,所以它经常是MDDYY。

有没有找到平均值或中位数(我可以使用)日期的方法?如果有奇数天,median工作正常,但对于偶数,我认为它是平均两个不产生合理值的中间数。我一直在尝试使用regexp将日期转换为MatLab格式并将其重新组合在一起,但我还没有让它工作。感谢

dates=[32381 41081  40581  32381  32981 41081   40981  40581];

4 个答案:

答案 0 :(得分:5)

您可以使用datenum将日期转换为序列日期编号(01/01/0000为1,02/01/0000为2,01/01/011为367等):

strDate='27112011';
numDate = datenum(strDate,'ddmmyyyy')

然后可以对这些日期数进行任何算术运算,例如取均值或中位数:

mean(numDates)
median(numDates)

这里唯一的问题是,你的日期不是字符串类型,而是数字。幸运的是,datenum也接受数字输入,但你必须将日期,月份和年份分成一个向量:

numDate = datenum([year month day])

或如果您有多个时间戳,则为矩阵中的行。

因此,对于您指定的示例数据:

dates=[32381 41081  40581  32381  32981 41081   40981  40581];
years  = mod(dates,100);
dates  = (dates-years)./100;
days   = mod(dates,100);
months = (dates-days)./100;
years = years + 1900; % set the years to the 20th century

numDates = datenum([years(:) months(:) days(:)]);
fprintf('The mean date is %s\n', datestr(mean(numDates)));
fprintf('The median date is %s\n', datestr(median(numDates)));

在这个例子中,我使用datestr将得到的均值和中位数转换为可读日期格式,它将序列日期编号作为输入。

答案 1 :(得分:1)

试试这个:

dates=[32381 41081 40581 32381 32981 41081 40981 40581];
d=zeros(1,length(dates));
for i=1:length(dates)
    d(i)=datenum(num2str(dates(i)),'ddmmyy');
end
m=mean(d);
m_str=datestr(m,'dd.mm.yy')

我希望此信息有用,尊重

答案 2 :(得分:0)

将日期存储为YYMMDD,而不是MMDDYY。这具有有用的副作用,即日期的数字顺序也是按时间顺序排列。

以下是您可以编写的函数的伪代码。

foreach date:
    year = date % 100
    date = (date - year) / 100
    day = date % 100
    date = (date - day) / 100
    month = date
    newdate = year * 100 * 100 + month * 100 + day
end for

一旦你有YYMMDD格式的日期,然后找到中位数(数字),这也是按时间顺序排列的中位数。

答案 3 :(得分:0)

您在上面看到如何将日期显示为数字。

我不会添加您查找列表中位数的问题。当存在偶数个值时,默认的matlab median函数将平均两个中间值。

但你可以自己做!试试这个:

dates; % is your array of dates in numeric form
sdates = sort(dates);
mediandate = sdates(round((length(sdates)+1)/2));