如何查找存储在1 x 34单元格中的34时间表的最小值,最大值和平均值,并将其作为额外列添加到相应的时间表?

14意见(最近30天)
卡尔Dilkington
卡尔Dilkington 在2020年4月30日
编辑: 辛达族于2020年5月13日
我有34个CSV文件,每个文件由n行和3列组成。我的代码一次通过一个CSV文件(在1 x 34单元中存储它们),首先将它们转换为n x 2时间表,tt {jj}。然后,我可以通过timerange过滤此时间表(使用dd / mm / uuuuu hh:mm格式的两个日期和时间之间的差异),以将存储在TT2 {JJ}中的TIMERANGE中的所有值留下。时间表有2列(日期和时间,温度)。
我现在想知道如何找到每个时间表的温度列的最小,最大和平均值,以及如何将这些值添加到原始时间表以创建n x 5时间表(日期和时间,温度,min temp,max临时,均值,意思是这样的:
例如对于JJ = 1,最终的表将如下所示:
日期/时间温度最小max均值
2012年2月21日08:00 20 16 20 18.25
2012/2020 08:03 16.
2012/02/2020 08:06 18
21/02/2020 08:09 19
等等等等
那么它会循环再次JJ = 2等
创建TT2 {} JJ的循环是:
为了JJ = 1:34.
thisfile {JJ} = {文件JJ}。名称;%创建包含在目录中的每个CSV文件名的细胞
t {jj} = readtable(thisfile {jj},'Headerlines'19,'readvariablenames',真的);%转换的CSV时间表忽略行1-19
tt {jj} = table2timetable(t {jj}(:,[1 3]));%将表转换为时间表和忽略第2列
TT2 {JJ} = {TT JJ}(TR,:);%创建一个包含所有行的时间表TIMERANGE TR内发现
结尾
在循环结束时(上图)我将34个表导出到具有34个选项卡的一个电子表格。
我不知道如何继续欣赏任何帮助。

答案(3)

辛达族
辛达族 在2020年4月30日
这是你想做的:
  • 在给定的表中加载(例如JJ = 1)
  • 创建TT2 {1}
  • 找到tt {1}的min .temperature
  • 将第三列添加到TT {1}在每一行中包含此分钟
  • 重复的平均值,最大值
  • 重复tt {2:34}
如果是这样,那么:
为了JJ = 1:34.
thisfile {JJ} = {文件JJ}。名称;%创建包含在目录中的每个CSV文件名的细胞
t {jj} = readtable(thisfile {jj},'Headerlines'19,'readvariablenames',真的);%转换的CSV时间表忽略行1-19
tt {jj} = table2timetable(t {jj}(:,[1 3]));%将表转换为时间表和忽略第2列
TT2 {JJ} = {TT JJ}(TR,:);%创建一个包含所有行的时间表TIMERANGE TR内发现
TT2 {JJ} .min_T = repelem(分钟(TT2 {JJ} {:, 2}),尺寸(TT2 {JJ},1),1);
TT2 {JJ} .max_T = repelem(MAX(TT2 {JJ} {:, 2}),尺寸(TT2 {JJ},1),1);
TT2 {JJ} .mean_T = repelem(平均值(TT2 {JJ} {:, 2}),尺寸(TT2 {JJ},1),1);
结尾
如果要修改t(或同样tt):
......
t {jj} .min_t = repelem(min(tt2 {jj} {:,,2}),大小(t {jj},1),1);
......
4评论
辛达族
辛达族 于2020年5月13日
阅读更新的问题,我看到您希望在同一XLS文件的不同纸张中的数据。这种语法将为任何方法工作
writetimetable(TT2 {JJ}“table.xls”'床单',JJ)

登录评论。


guillaume.
guillaume. 于2020年5月1日
最简单的事情是将一列添加到每个时间表指出原产时间表,然后串联所有这些时间表到一个时间表。然后,只需一个电话,以 团体ummary ,你可以得到你想要的输出。
但是,如果您获得每个时间表的平均值,最小和最大值,因此每个时间表都获得一个标量值,我有点不清楚为什么你仍然想要存储DateTime。这不是毫无意义吗?
反正:
TT =细胞(大小(文件));
为了fileidx = 1:numel(文件)
t = readtable(文件(fileidx).name,'Headerlines'19,'readvariablenames', 真的);
TT {fileidx} = table2timetable(T(:,[1,3]))
tt {filedx} .fileIndex(:) = filedx;%添加文件编号
结尾
Alltimetables = VertCAT(TT {:});%连击都在同一个时间表
alltimetables = alltimetables(TR,:);%只保留所需的timerange
ttstats = comononummary(适用物,'FileIndex',{'意思''min''最大限度'})%fileIndex的%min min max
请注意,如果您使用的是最近版本的MATLAB,我将替换循环:
TT =细胞(大小(文件));
opts = detectimportoptions(文件(1).name,'NumHeaderLines'19,'readvariablenames', 真的);
opts.SelectedVariableNames = [1,3];%不要打扰第2列
为了fileidx = 1:numel(文件)
tt {filedx} = readtimetable(文件(fileidx).name,opts);
tt {filedx} .fileIndex(:) = filedx;%添加文件编号
结尾
剩余的代码保持不变
1条评论
卡尔Dilkington
卡尔Dilkington 于2020年5月13日
感谢您的回答。我已经修改了我的问题,包括对正是我需要更多的细节和清晰度。在我的循环结束时,我都34个时间表导出到电子表格34级的标签,所以我还是需要的日期/时间。我想要的最小值,最大值和平均值,所以我不必在每个Excel时间表/标签做手工。
我假设代码替换循环比我拥有的更有效吗?
谢谢你的帮助。

登录评论。


彼得珀金斯
彼得珀金斯 于5月5日20日
正如其他人所说,在每个时间表中创造新的变量似乎很少有意义,每个变量是常数的列向量。也许你想要一些这样的东西。
首先,制作类似您的数据:
n = 3;
tt_list = cell(n,1);
为了I = 1:3
x =兰特(5,1);
时间=日期时间(2020,5,I)+天(兰特(5,1));
tt_list {i} =时间表(时间,x);
结尾
现在可以获得每个时间表的统计数据,并将其中的表格放在包含的时间表数组中:
t =表(tt_list,零(n,1),零(n,1),零(n,1),'variablenames',[“数据”,“中庸”,“最小”,“最大”]);
为了我= 1:n
t.mean(i)=均值(tt_list {i} .x);
t.min(i)= min(tt_list {i} .x);
t.max(i)= max(tt_list {i} .x);
结尾
从那里,你最终结束了
>> T
t =
3.×4表
数据意思最大限度
____________________________________
{5.×1时间表} 0.67375 0.4607 0.94475
{5.×1时间表} 0.56289 0.15039 0.9865
{5.×1时间表} 0.52956 0.26661 0.91785
这是蛮力方式。由于纪尧姆建议,你可能会发现它方便的把所有的时间表,在一个较长的一个。下面让你基本上YHE同一张桌子上面。
TT = vertcat(TT_列表{:});
tt.source = Repelem(1:n,5)';
Fun = @(x)交易(平均(x),min(x),max(x));
t = rowfun(有趣,tt,'GroupingVariable''来源''numoutputs',3,......
'输出格式''桌子''outputvariablenames',[“意思是”min“”max“])
>> T =
3.×5表
来源GroupCount.意思最大限度
_____________________________________
1 5 0.67375 0.4607 0.94475
2 5 0.56289 0.15039 0.9865
3 5 0.52956 0.26661 0.91785
我用rowfun;splitapply或groupsummary也将工作。
1条评论
卡尔Dilkington
卡尔Dilkington 于2020年5月13日
感谢您的回答。我已经修改了我的问题,包括对正是我需要更多的细节和清晰度。在我的循环结束时,我都34个时间表导出到电子表格34级的标签,所以我还是需要的日期/时间。我想要的最小值,最大值和平均值,所以我不必在每个Excel时间表/标签做手工。
谢谢你的帮助。

登录评论。

社区宝藏狩猎

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!