分析存储在csv中的天气数据

时间:2019-07-07 13:49:03

标签: matlab

我将一些天气数据存储在csv文件中,格式为:“ id,日期,温度,降雨量”,其中id是气象站,显然日期是测量日期。该文件包含10年内3个不同站点的数据。 我想做的是分析每个站点和每年的数据。例如:我想计算每个站点和每年的温度[abs((n + 1)-n)]的每日差异。

我认为while循环可能是可行的,只要id值等于下一行中的值,循环就可以进行计算。 但是我不知道该怎么做。

最诚挚的问候

2 个答案:

答案 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