我有一个数据集,我已经提取了事件发生的日期。日期的格式为MMDDYY,虽然MatLab没有显示前导零,所以它经常是MDDYY。
有没有找到平均值或中位数(我可以使用)日期的方法?如果有奇数天,median
工作正常,但对于偶数,我认为它是平均两个不产生合理值的中间数。我一直在尝试使用regexp
将日期转换为MatLab格式并将其重新组合在一起,但我还没有让它工作。感谢
dates=[32381 41081 40581 32381 32981 41081 40981 40581];
答案 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));