2

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

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

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

4 回答 4

5

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

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将生成的平均值和中位数转换回可读的日期格式,该格式将日期序列号作为输入。

于 2012-05-06T23:05:08.007 回答
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')

我希望这个信息是有用的,问候

于 2012-05-07T03:55:09.870 回答
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 格式的日期,然后找到中位数(数字),这也是按时间顺序排列的中位数。

于 2012-05-06T21:55:51.290 回答
0

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

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

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

dates; % is your array of dates in numeric form
sdates = sort(dates);
mediandate = sdates(round((length(sdates)+1)/2));
于 2012-05-07T03:30:05.133 回答