Анализ данных о погоде, хранящихся в CSV - PullRequest
0 голосов
/ 07 июля 2019

У меня есть некоторые погодные данные, сохраненные в CSV-файле в виде: «id, дата, температура, количество осадков», где id - это метеостанция, и, очевидно, date - это дата измерения. Файл содержит данные 3 разных станций за период 10 лет. Что я хотел бы сделать, это проанализировать данные каждой станции и каждого года. Например: я хотел бы рассчитать ежедневные различия в температуре [abs ((n + 1) -n)] для каждой станции и каждого года.

Я думал, что возможны циклы while, когда цикл вычисляет что-то, пока значение id равно значению в следующей строке. Но я не знаю, как это сделать.

С уважением

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Если вам все еще нужна помощь, я бы посоветовал импортировать данные из файла .csv, используя «readtable». Поскольку только первая строка является текстовой, MATLAB будет создавать переменную 'table' (это не должно быть проблемой для файла .csv). Доступ к отдельным столбцам можно получить через "tablename.header", и его можно восстановить как двойной тип данных (ex variable_1 = tablename.header). Затем вы можете объединить свой набор данных, как вам нравится. Что касается сортировки по дате и идентификатору станции, я бы рекомендовал использовать «sortrows». Например, если идентификатор станции является первым столбцом, sortrow (data, 1) будет сортировать «данные» по идентификатору станции. sortrow (data, [1 2]) будет сортировать «данные» по первому столбцу, а затем по второму столбцу. Оттуда вы можете написать оператор if для сравнения идентификаторов станций и выполнения необходимых вычислений. Я надеюсь, что мой краткий ответ несколько полезен. Базовая структура кода будет:

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
0 голосов
/ 07 июля 2019

Всегда полезно иметь фактические данные для работы и уточнять, какой тип выходного формата ожидается. В основном, входы и выходы :) Учитывая небольшую предоставленную информацию, я решил, что в первом разделе я буду генерировать для вас случайные данные, а затем вычислять некоторые характеристики во втором. Я включил цикл в качестве примера, поскольку именно об этом вы и просили, но я настоятельно рекомендую использовать векторизованные вычисления, когда это возможно, например, в сводной статистике.

%% 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

При этом получается одна строка, напечатанная для каждой строки данных (и рассчитывается только разница в температуре, когда нет смены года или станции). В конце он также выводит некоторую сводную статистику, вот что я получаю:

              stationIds    years    GroupCount    mean_temp    min_temp    max_temp      meanci_temp       mean_rain    min_rain    max_rain      meanci_rain   
              __________    _____    __________    _________    ________    ________    ________________    _________    ________    ________    ________________

    1_2016    1             2016      82            63.13       30.008       99.22      58.543    67.717    6.1181       0           19.729      4.6284    7.6078
    1_2017    1             2017     365           65.914       30.028      99.813      63.783    68.045    5.0075       0           19.933      4.3441    5.6708
    1_2018    1             2018     365           65.322       30.218      99.773      63.275    67.369    4.7039       0           19.884      4.0615    5.3462
    1_2019    1             2019     188           63.642        31.16      99.654      60.835    66.449    5.9186       0           19.864      4.9834    6.8538
    2_2016    2             2016      82           65.821       31.078      98.144      61.179    70.463    4.7633       0           19.688      3.4369    6.0898
    2_2017    2             2017     365           66.002       30.054      99.896      63.902    68.102    4.5902       0           19.902      3.9267    5.2537
    2_2018    2             2018     365           66.524       30.072      99.852      64.359     68.69    4.9649       0           19.812      4.2967    5.6331
    2_2019    2             2019     188           66.481       30.249      99.889      63.647    69.315    5.2711       0           19.811      4.3234    6.2189
    3_2016    3             2016      82           61.996       32.067      98.802      57.831    66.161    4.5445       0           19.898      3.1523    5.9366
    3_2017    3             2017     365           63.914       30.176      99.902      61.932    65.896    4.8879       0           19.934       4.246    5.5298
    3_2018    3             2018     365           63.653       30.137      99.991      61.595    65.712    5.3728       0           19.909      4.6943    6.0514
    3_2019    3             2019     188           64.201       30.078        99.8      61.319    67.082    5.3926       0           19.874      4.4541    6.3312
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...