鱼C论坛

 找回密码
 立即注册
查看: 4429|回复: 20

[已解决]matlab代码

[复制链接]
发表于 2023-4-17 09:28:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
读取气温nc文件,并整理成逐年逐站点平均气温或者出气温分布图
最佳答案
2023-4-18 22:23:49
聆風祈 发表于 2023-4-18 22:18
大佬,修改完之后这里跑不通
错误使用 array2table
'0           2.5             5           7.5     ...

问题是由于变量名和行名超出了Excel表格允许的最大长度。为解决这个问题,我们需要将经度和纬度的值转换为更短的字符串。以下是修复后的代码:

  1. % 输出结果到Excel文件
  2. excel_filename = 'Annual_Avg_Temperature.xlsx';

  3. for i = 1:num_years
  4.     year = years(i);
  5.     sheet_name = sprintf('Year %d', year);
  6.     % 创建更短的经度和纬度字符串
  7.     lon_str = cellstr(sprintfc('Lon%.1f', lon));
  8.     lat_str = cellstr(sprintfc('Lat%.1f', lat));
  9.     T = array2table(annual_avg_temp(:, :, i), 'VariableNames', lon_str, 'RowNames', lat_str);
  10.     writetable(T, excel_filename, 'Sheet', sheet_name, 'WriteRowNames', true);
  11. end

  12. disp('已将年平均气温按经纬度分布保存到Excel文件。');
复制代码


这将创建更短的经度和纬度字符串(例如,Lon0.0,Lat90.0),用作Excel表格的变量名和行名。

请使用这个修复后的代码片段替换之前的Excel输出部分。如果您还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-17 09:34:54 | 显示全部楼层
歌者文明清理员 发表于 2023-4-17 09:31
以下是 MATLAB 读取气温 nc 文件并生成逐年逐站点平均气温的代码示例:

大佬,啥意思,那个nc好像是二进制的,打开乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 09:35:40 | 显示全部楼层
歌者文明清理员 发表于 2023-4-17 09:31
以下是 MATLAB 读取气温 nc 文件并生成逐年逐站点平均气温的代码示例:

嗷嗷,好的,谢谢大佬,我试试去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 18:54:39 | 显示全部楼层
isdkz 发表于 2023-4-17 09:35
根据您的要求,下面是一个MATLAB代码示例,用于读取气温数据的NetCDF文件,并按年和站点计算平均气温以及生 ...

nc文件中变量名和数据集时间单位如何查看啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 19:14:56 | 显示全部楼层
本帖最后由 聆風祈 于 2023-4-17 19:19 编辑
isdkz 发表于 2023-4-17 18:56
您可以使用MATLAB中的ncdisp函数查看NetCDF文件中的变量名和数据集时间单位。下面是如何使用ncdisp函数的 ...


查看之后发现是网格数据
Variables:
lat
           Size:       73x1
           Dimensions: lat
           Datatype:   single
           Attributes:
                       units         = 'degrees_north'
                       actual_range  = [90 -90]
                       long_name     = 'Latitude'
                       standard_name = 'latitude'
                       axis          = 'Y'
    lon
           Size:       144x1
           Dimensions: lon
           Datatype:   single
           Attributes:
                       units         = 'degrees_east'
                       long_name     = 'Longitude'
                       actual_range  = [0         357.5]
                       standard_name = 'longitude'
                       axis          = 'X'
    time
           Size:       901x1
           Dimensions: time
           Datatype:   double
           Attributes:
                       long_name       = 'Time'
                       delta_t         = '0000-01-00 00:00:00'
                       avg_period      = '0000-01-00 00:00:00'
                       prev_avg_period = '0000-00-01 00:00:00'
                       standard_name   = 'time'
                       axis            = 'T'
                       units           = 'hours since 1800-01-01 00:00:0.0'
                       actual_range    = [1297320  1954776]
    air
           Size:       144x73x901
           Dimensions: lon,lat,time
           Datatype:   single
           Attributes:
                       long_name               = 'Monthly Mean Air Temperature at sigma level 0.995'
                       valid_range             = [-2000  2000]
                       units                   = 'degC'
                       add_offset              = 0
                       scale_factor            = 1
                       missing_value           = -9.969209968386869e+36
                       precision               = 1
                       least_significant_digit = 0
                       var_desc                = 'Air Temperature'
                       statistic               = 'Mean'
                       parent_stat             = 'Individual Obs'
                       dataset                 = 'NCEP Reanalysis Derived Products'
                       level_desc              = '0.995 sigma'
                       actual_range            = [-73.78       42.146]
可以将其处理成一个工作簿一年,年平均气温按经纬度分布的excel文件么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 19:59:42 | 显示全部楼层
isdkz 发表于 2023-4-17 19:34
根据您提供的变量信息,下面是一个MATLAB代码示例,用于读取网格化气温数据的NetCDF文件,并按年计算平均 ...

错误使用  /
矩阵维度必须一致。

出错 untitled (第 15 行)
years = unique(floor(time / (365 * time_hours)));

运行后提示这个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 20:10:36 | 显示全部楼层
isdkz 发表于 2023-4-17 20:02
对不起,我犯了一个错误。time_hours应该是一个标量值,而不是数组。我们只需要提取小时数。这里是修复后 ...

修改之后提示这个

位置 3 处的索引超出数组边界。索引不能超过 901。

出错 untitled (第 254行)
    annual_avg_temp(:, :, i) = mean(air(:, :, start_time:end_time), 3);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 20:28:58 | 显示全部楼层
isdkz 发表于 2023-4-17 20:12
这个错误是因为在计算start_time和end_time时,没有将time数组中的起始时间考虑进去。以下是修复后的代码 ...

修改之后提示这样

无法执行赋值,因为左侧的大小为 73×144,右侧的大小为 144×73。

出错 untitled (第 28 行)
    annual_avg_temp(:, :, i) = mean(air(:, :, start_time:end_time), 3);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 22:06:35 | 显示全部楼层
isdkz 发表于 2023-4-17 20:45
这个问题是由于在为annual_avg_temp数组分配值时,维度不匹配所致。我们需要将air数组的第一个和第二个维 ...

错误使用 array2table
'0           2.5             5           7.5            10          12.5            15
17.5            20          22.5            25          27.5            30          32.5
35          37.5            40          42.5            45          47.5            50
52.5            55          57.5            60          62.5            65          67.5
70          72.5            75          77.5            80          82.5            85
87.5            90          92.5            95          97.5           100         102.5
105         107.5           110         112.5           115         117.5           120
122.5           125         127.5           130         132.5           135         137.5
140         142.5           145         147.5           150         152.5           155
157.5           160         162.5           165         167.5           170         172.5
175         177.5           180         182.5           185         187.5           190
192.5           195         197.5           200         202.5           205         207.5
210         212.5           215         217.5           220         222.5           225
227.5           230         232.5           235         237.5           240         242.5
245         247.5           250         252.5           255         257.5           260
262.5           265         267.5           270         272.5           275         277.5
280         282.5           285         287.5           290         292.5           295
297.5           300         302.5           305         307.5           310         312.5
315         317.5           320         322.5           325         327.5           330
332.5           335         337.5           340         342.5           345         347.5
350         352.5           355         357.5' 超过了表变量名称允许的最大长度。

出错 untitled (第 37 行)
    T = array2table(annual_avg_temp(:, :, i), 'VariableNames', cellstr(num2str(lon')), 'RowNames', cellstr(num2str(lat)));

修改之后这样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 14:40:56 | 显示全部楼层
isdkz 发表于 2023-4-17 20:45
这个问题是由于在为annual_avg_temp数组分配值时,维度不匹配所致。我们需要将air数组的第一个和第二个维 ...

大佬在嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 22:18:07 | 显示全部楼层
isdkz 发表于 2023-4-17 20:45
这个问题是由于在为annual_avg_temp数组分配值时,维度不匹配所致。我们需要将air数组的第一个和第二个维 ...

大佬,修改完之后这里跑不通
错误使用 array2table
'0           2.5             5           7.5            10          12.5            15
17.5            20          22.5            25          27.5            30          32.5
35          37.5            40          42.5            45          47.5            50
52.5            55          57.5            60          62.5            65          67.5
70          72.5            75          77.5            80          82.5            85
87.5            90          92.5            95          97.5           100         102.5
105         107.5           110         112.5           115         117.5           120
122.5           125         127.5           130         132.5           135         137.5
140         142.5           145         147.5           150         152.5           155
157.5           160         162.5           165         167.5           170         172.5
175         177.5           180         182.5           185         187.5           190
192.5           195         197.5           200         202.5           205         207.5
210         212.5           215         217.5           220         222.5           225
227.5           230         232.5           235         237.5           240         242.5
245         247.5           250         252.5           255         257.5           260
262.5           265         267.5           270         272.5           275         277.5
280         282.5           285         287.5           290         292.5           295
297.5           300         302.5           305         307.5           310         312.5
315         317.5           320         322.5           325         327.5           330
332.5           335         337.5           340         342.5           345         347.5
350         352.5           355         357.5' 超过了表变量名称允许的最大长度。

出错 untitled (第 37 行)
    T = array2table(annual_avg_temp(:, :, i), 'VariableNames', cellstr(num2str(lon')), 'RowNames', cellstr(num2str(lat)));
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 00:02:33 | 显示全部楼层
isdkz 发表于 2023-4-18 22:23
问题是由于变量名和行名超出了Excel表格允许的最大长度。为解决这个问题,我们需要将经度和纬度的值转换 ...

感谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-1 15:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表