Matlab Excel数据转成面板数据格式

Stata总是整不明白而且如果后续还想加新的数据列,还得单独用Stata转换,再合并挺麻烦的。于是希望用Matlab直接转成面板数据,然后直接复制粘贴,就方便得多。

函数无参数则默认选中的文件中所有的工作簿都转换

有参数的话,第一参数是工作簿名字,第二个参数是年份范围

如图所示

先选择转换的文件,可以是csv,xls,xlsx

 转成

 可以支持一个文件里多个工作簿的转换

原始数据格式要求:第一列是省名,第一行是年份,年份至少要保证有数值,可以是如2022,可以是2022年。

注意:省名要自己先排好序,要保证每个工作簿的省份顺序要一样。

贴上代码,萌新代码,多多包涵,帮助到你了的话,麻烦给个赞嗷,感谢。

function Processing_Panel(varargin)
%%%如果不写入参数,就是选中文件的所有工作簿
%%%第一个参数为选定的工作簿
%%%第二个参数为年份范围的数组
%%%
warning off

[file,path] = uigetfile({'*.*';'*.csv';'*.xls';'*.xlsx'},'请选择文件夹','MultiSelect', 'on');
file = cellstr(file);
for ii = 1:length(file)
    file_path = [path,file{ii}];
    if isempty(varargin)
        [~, Sheet]=xlsfinfo(file_path);
    else
        Sheet = varargin(1);
        year_lim = varargin{2};
    end
    for iii = 1:length(Sheet)
        try
            [~,~,dataset] = xlsread(file_path,Sheet{iii});
            province = dataset(2:end,1);
            year_s = dataset(1,2:end);
            year = [];
            
            for i = 1:length(year_s)
                a = year_s{i};
                if ischar(a)
                    b=a(isstrprop(a,'digit'));
                    year = [year str2double(b)];
                else
                    year = [year a];
                end
            end
            [year, ind] = sort(year);
            data = dataset(2:end,2:end);
            data = cell2mat(data);
            data = data(:,ind);
            
            if ~isempty(varargin)
                d = [];
                if year_lim
                    for i = 1: length(year)
                        if ~ismember(year(i),year_lim)
                            d = [d i];
                        end
                    end
                end
                
                year(d)=[];
                data(:,d)=[];
            end
            
            data_new = {};
            for i = 1:length(province)
                temp = {};
                temp(1:length(year),1)=province(i);
                temp(1:length(year),2)=num2cell(ones(1,length(year))*i);
                temp(1:length(year),3)=num2cell(year');
                temp(1:length(year),4)=num2cell(data(i,:)');
                data_new = [data_new;temp];
            end
            new_name = ['处理_' file{ii}];
            writecell(data_new,[path new_name],'Sheet',Sheet{iii});
        catch
            fprintf("%s 的 %s 工作簿转换失败",file{ii},Sheet{iii});
            continue
        end
    end
    
end



Matlab Excel数据转成面板数据格式

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空花缱绻三分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值