在MATLAB中从CSV文件读取日期和时间

10
datetime, M01, M02, M03, M04, M05, M06
8/15/2009 0:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9
8/15/2009 0:10, 7.1, 8.1, 8.1, 7.7, 0, 8.1
8/15/2009 0:20, 6.8, 7.4, 7.6, 7.1, 0, 7.3
8/15/2009 0:30, 5.6, 6.8, 7.1, 6.6, 0, 6.8
8/15/2009 0:40, 3.9, 6.2, 6.4, 6.2, 0, 6.4
8/15/2009 0:50, 4.6, 5.5, 6.1, 5.8, 0, 5.6
8/15/2009 1:40, 7, 7, 7.2, 6.9, 0, 6.3

你能帮我正确读取这个CSV文件吗,以便我可以使用datenum将第一列转换为字符串?当然不能用csvread。使用textscan时,我不知道该如何调用它,以免出错。日期和时间在同一列中。
抱歉,这可能是一个愚蠢的问题!!!
我现在知道如何读取上述文件。但是,如何将其写回到一个名为file.txt的文件中,并保持完全相同的格式呢?我的意思是我修改了一些列,现在需要一个类似的文件,其中第一行和第一列的格式相同。 感谢您的帮助。

如果文件包含逗号分隔的值,那么在您上面的示例中逗号位于哪里?日期和时间值之间有逗号分隔吗? - gnovice
1
不要使用逗号分隔每个字段。日期和时间在一列中,因此它们之间没有逗号,更像是8/15/2009 0:00:10、5.8、7.8、7.3、0、7.9。 - AP.
2个回答

15
根据您上面的评论,如果数据看起来像:
datetime, M01, M02, M03, M04, M05, M06
8/15/2009 0:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9
8/15/2009 0:10, 7.1, 8.1, 8.1, 7.7, 0, 8.1
8/15/2009 0:20, 6.8, 7.4, 7.6, 7.1, 0, 7.3
8/15/2009 0:30, 5.6, 6.8, 7.1, 6.6, 0, 6.8
8/15/2009 0:40, 3.9, 6.2, 6.4, 6.2, 0, 6.4
8/15/2009 0:50, 4.6, 5.5, 6.1, 5.8, 0, 5.6
8/15/2009 1:40, 7, 7 7.2, 6.9, 0, 6.3

然后使用以下方法将其作为矩阵读取:

fid = fopen('file.csv', 'rt');
a = textscan(fid, '%s %f %f %f %f %f %f', ...
      'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1);
fclose(fid);

format short g
M = [datenum(a{1}) a{2}]

...然后我得到的输出结果是:

M =
    7.34e+005        5.8        7.8        7.8        7.3          0        7.9
    7.34e+005        7.1        8.1        8.1        7.7          0        8.1
    7.34e+005        6.8        7.4        7.6        7.1          0        7.3
    7.34e+005        5.6        6.8        7.1        6.6          0        6.8
    7.34e+005        3.9        6.2        6.4        6.2          0        6.4
    7.34e+005        4.6        5.5        6.1        5.8          0        5.6
    7.34e+005          7          7        7.2        6.9          0        6.3

如果您将显示格式设置为长输出,您将看到完整的数字(请注意它们仍然以完整形式存储),或使用fprintf

fprintf('%.9f\n', M(:,1))
734000.000000000
734000.006944445
734000.013888889
734000.020833333
734000.027777778
734000.034722222
734000.069444445

我曾经使用过类似的代码,即使我复制你的代码也得到了相同的结果。 7.340000000000000 0.000058000000000 0.000078000000000 7.340000069444445 0.000071000000000 0.000081000000000 7.340000138888889 0.000068000000000 0.000074000000000 我只是复制了输出的3行n列的结果。 为什么数字要除以100000?当我尝试执行M= [datenum(a(1)) a (2)]时,我得到了奇怪的答案。 而且当我更改日期时,我在第一列中得到了相同的一组字符串,所以我不知道发生了什么。 有任何线索吗? - AP.
非常感谢。你太棒了! 现在它可以工作了。 你能解释一下“rt”、“collectoutput”是什么吗? 在格式短的后面加上g是什么意思? 你很棒! - AP.
你只需要查阅每个函数的文档。rt代表读取和文本模式(而不是二进制模式)。collectoutput:将连续的具有相同数据类型的输出单元格连接成一个数组。format short g:使用最佳的定点或浮点格式(110.1 vs 1.1010e+002)。 - Amro

2

TEXTSCAN本身不会转换日期,但您可以仅对需要转换的列调用DATENUM。

f = fopen('datafile.txt');
data = textscan(f, '%s %f %f %f %f %f %f', 'Delimiter', ',', 'HeaderLines', 1);
fclose(f);
data{1} = datenum(data{1});

该函数将返回一个单元数组data,其中第一列是对应于每个日期的MATLAB datenum,每个其他列是文件中相应的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接