从.dat文件中挑选时间数据

问题描述 投票:0回答:1

刚刚发现 Octave,并且主要来自 Matlab 背景,我很惊讶这样的程序的存在。

这是我正在使用 Octave 处理的数据示例:

#Recipe: VAC Test
#Pressure: TORR
#Temp.: C
#TC Labels: TC0;TC1;TC2;TC3;TC4;TC5;TC6;TC7;TC8;TC9;TC10;TC11;TC12;TC13;TC14;TC15;TC16;TC17;TC18;TC19;TC20;TC21;TC22;TC23
230915 13:51:52;1;1;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:53;2;2;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:54;3;3;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
~
~
~
230918 07:27:47;236156;236156;1.396E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:48;236157;236157;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:49;236158;236158;1.399E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:50;236159;236159;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:51;236160;236160;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:52;236161;236161;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3

我目前已设置脚本将日期和时间之间的空格替换为“;”为了保持定界的一致性,然后继续将数据放入矩阵中。 我可以轻松获得我主要需要的数据——日期(第 1 列)、压力(第 5 列)和两个温度值(最后两列)。

但是,当时我很困惑,然后是日期的格式......我需要它们来绘制温度和压力的图。

日期是YYMMDD格式,而这种格式恰好是Octave似乎不支持输出的格式(根据https://octave.sourceforge.io/octave/function/datestr.html)。

使用 dlmread,时间将仅包含冒号之前的第一个数字。 示例:13:51:52 的值为 13

我尝试过 csv2cell,但它似乎将其放入一个巨大的 Rx1 向量中,而不是矩阵中。

该脚本的目标是最终将其转换为可执行文件,用户将在其中输入真空室的日志文件,输出将是 i) 修改后的文件,以及 ii) 两张温度和压力图日期和时间。

9 月 26 日编辑: 我想将 datenum()、datestr() 与第一列中的数据一起使用。但是,由于数据以 YYMMDD 格式显示,我无法在此处使用任何指定的代码格式:octave.sourceforge.io/octave/function/datestr.html 从它的外观来看,我需要将其拆分为 YY、MM, DD,并将其与 datenum() 一起使用以正确输入。我试过:

textscan(file, '%s %s', 'delimiter', ';', 'headerlines', 4)

连同:

textscan(file, '%d %d', 'delimiter', ';', 'headerlines', 4)

textscan(file, '%d %d:%d:%d', 'delimiter', ';', 'headerlines', 4)

但是它们都以空向量的形式返回,或者只是带有文件名的单个向量。

如有任何帮助,我们将不胜感激,谢谢。

time octave
1个回答
0
投票

这绝不是最快的方法,但即使您的数据是数字,使用

dlmread
以外的其他方法可能会更好。一些方法:

如果您告诉 datevec 格式是什么,则该日期格式是可读的。例如,

datevec("230915 13:51:52", "yymmdd HH:MM:SS")
ans =

   2023      9     15     13     51     52

为了读取数据,如果我首先手动修剪掉所有

~
行,则会留下:

#Recipe: VAC Test
#Pressure: TORR
#Temp.: C
#TC Labels: TC0;TC1;TC2;TC3;TC4;TC5;TC6;TC7;TC8;TC9;TC10;TC11;TC12;TC13;TC14;TC15;TC16;TC17;TC18;TC19;TC20;TC21;TC22;TC23
230915 13:51:52;1;1;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:53;2;2;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:54;3;3;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230918 07:27:47;236156;236156;1.396E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:48;236157;236157;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:49;236158;236158;1.399E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:50;236159;236159;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:51;236160;236160;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:52;236161;236161;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3

然后以下工作可以接受:

fid = fopen ('data.txt');
data = textscan(fid, "%d %d:%d:%d;%d;%d;%f;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;%f;%f\n", "he
aderlines",4)
data = 
{
  [1,1] =

    230915
    230915
    230915
    230918
    230918
    230918
    230918
    230918
    230918

  [1,2] =

    13
    13
    13
     7
     7
     7
     7
     7
     7

  [1,3] =

    51
    51
    51
    27
    27
    27
    27
    27
    27
                                                                                                                                           
  [1,4] =

    52
    53
    54
    47
    48
    49
    50
    51
    52

  [1,5] =

         1
         2
         3
    236156
    236157
    236158
    236159
    236160
    236161

  [1,6] =

         1
         2
         3
    236156
    236157
    236158
    236159
    236160
    236161

  [1,7] =

     9.0000e+02
     9.0000e+02
     9.0000e+02
     1.3960e-04
     1.3970e-04
     1.3990e-04
     1.3980e-04
     1.3980e-04
     1.3970e-04

  [1,8] =

     19.600
     19.600
     19.600
     26.500
     26.500
     26.500
     26.500
     26.500
     26.500

  [1,9] =

     19.100
     19.100
     19.100
     26.300
     26.300
     26.300
     26.300
     26.300
     26.300

}
fclose(fid);

现在,每个单元格条目都是数据的列之一。在这里,它们仍然是数字。您也许可以使用 %s 分隔符将某些分隔符保留为字符串,或尝试将日期组件保留在一起的其他格式字符串,但我发现这很容易从 textscan 输出的元胞数组中进行解析。由于它们的长度相同,因此您的日期和时间位于前四个元素中:

dates = data(1:4)
dates =
{
  [1,1] =

    230915
    230915
    230915
    230918
    230918
    230918
    230918
    230918
    230918

  [1,2] =

    13
    13
    13
     7
     7
     7
     7
     7
     7

  [1,3] =

    51
    51
    51
    27
    27
    27
    27
    27
    27

  [1,4] =

    52
    53
    54
    47
    48
    49
    50
    51
    52

}

将它们放入一个字符串中,datevec 可以被告知如何读取:

dates = num2str([dates{1:4}])
dates =

230915      13      51      52
230915      13      51      53
230915      13      51      54
230918       7      27      47
230918       7      27      48
230918       7      27      49
230918       7      27      50
230918       7      27      51
230918       7      27      52

(上述语法使用大括号

{1:4}
提取单元格内容,并将它们作为逗号分隔的列表放置在
[]
括号内以水平连接它们,然后将它们传递给 num2str ,将它们转换为均匀间隔的 char 数组) .

最后,使用我上面提到的语法将其转换为 datevec。该函数会将所有行解析为单独的向量:

dates = datevec (num2str (dates, "yymmdd HH MM SS")
dates =

   2023      9     15     13     51     52
   2023      9     15     13     51     53
   2023      9     15     13     51     54
   2023      9     18      7     27     47
   2023      9     18      7     27     48
   2023      9     18      7     27     49
   2023      9     18      7     27     50
   2023      9     18      7     27     51
   2023      9     18      7     27     52
© www.soinside.com 2019 - 2024. All rights reserved.