我将一些天气数据存储在csv文件中,格式为:“ id,日期,温度,降雨量”,其中id是气象站,显然日期是测量日期。该文件包含10年内3个不同站点的数据。 我想做的是分析每个站点和每年的数据。例如:我想计算每个站点和每年的温度[abs((n + 1)-n)]的每日差异。
我认为while循环可能是可行的,只要id值等于下一行中的值,循环就可以进行计算。 但是我不知道该怎么做。
最诚挚的问候
答案 0 :(得分:1)
如果您仍然需要帮助,我会考虑使用“ readtable”导入.csv文件数据。只要只有第一行是文本,MATLAB就会创建一个“表”变量(对于.csv文件,这应该不是问题)。可以通过“ tablename.header”访问各个列,并可以将其重建为双精度数据类型(例如,variable_1 = tablename.header)。然后,您可以根据需要串联数据集。至于按日期和站号排序,我主张使用“排序”。例如,如果工作站ID是第一列,sortrow(data,1)将按工作站ID对“数据”进行排序。 sortrow(data,[1 2])将按第一列,然后按第二列对“数据”进行排序。从那里,您可以编写一个if语句来比较站点ID并执行所需的计算。希望我的简短回答对您有所帮助。 基本代码结构为:
path=['copy and paste file path here']; % show matlab where to look
data=readtable([path '\filename.csv'], 'ReadVariableNames',1); % read the file from csv format to table
variable1=data.header1 % general example of making double type variable from table
variable2=data.header2
variable3=data.header3
double_data=[variable1 variable2 variable3]; % concatenates the three columns together
sorted_data=sortrows(double_data, [1 2]); % sorts double_data by column 1 then column 2
答案 1 :(得分:0)
始终可以使用实际数据并详细说明预期的输出格式。基本上,来龙去脉:)通过提供的少量信息,我认为我会在第一部分为您生成随机数据,然后在第二部分中计算一些统计信息。我以循环为例,因为这就是您要的内容,但是我强烈建议在可用的情况下使用向量化计算,例如在汇总统计数据中进行的计算。
default_stats = {
'username': 0,
'inventory': [[], []],
'exp': 0,
'current_exp': 0,
'required_exp': 0,
'level': 1,
'max_stamina': 10,
'class': '',
}
这将为每一行数据打印一行(并且仅在没有年份或站点更改的情况下计算温度差)。最后还会产生一些摘要统计信息,这就是我得到的:
%% example for weather stations
% generation of random data to correspond to what your csv file looks like
rng(1); % keeps the random seed for testing purposes
nbDates = 1000; % number of days of data
nbStations = 3; % number of weather stations
measureDates = repmat((now()-(nbDates-1):now())',nbStations,1); % nbDates days of data ending today
stationIds = kron((1:nbStations)',ones(nbDates,1)); % assuming 3 weather stations with IDs [1,2,3]
temp = rand(nbStations*nbDates,1)*70+30; % temperatures are in F and vary between 30 and 100 degrees
rain = max(rand(nbStations*nbDates,1)*40-20,0); % rain fall is 0 approximately half the time, and between 0mm and 20mm the rest of the time
csv = table(measureDates, stationIds, temp, rain);
clear measureDates stationIds temps rain;
% augment the original dataset as needed
years = year(csv.measureDates);
data = [csv,array2table(years)];
sorted = sortrows( data, {'stationIds', 'measureDates'}, {'ascend', 'ascend'} );
% example looping through your data
for i = 1 : size( sorted, 1 )
fprintf( 'Id=%d, year=%d, temp=%g, rain=%g', sorted.stationIds( i ), sorted.years( i ), sorted.temp( i ), sorted.rain( i ) );
if( i > 1 && sorted.stationIds( i )==sorted.stationIds( i-1 ) && sorted.years( i )==sorted.years( i-1 ) )
fprintf( ' => absolute difference with day before: %g', abs( sorted.temp( i ) - sorted.temp( i-1 ) ) );
end
fprintf( '\n' ); % new line
end
% depending on the statistics you wish to do, other more efficient ways of
% accessing summary stats might be accessible, for example:
grpstats( data ...
, {'stationIds','years'} ... % group by categories
, {'mean','min','max','meanci'} ... % statistics we want
, 'dataVars', {'temp','rain'} ... % variables on which to calculate stats
) % doesn't require data to be sorted or any looping