matlab从csv文件中读取时间转换异常
matlab 從 csv 文件中讀取時間轉換異常
最近一段時間一直在研究 matlab 讀取各種數據,自以為文件讀取的水平還行。可是,昨天,幫朋友讀取一個 csv 文件時,時間轉換卻讓我感到非常奇怪。無情打臉,滑稽。
本文所需要用到的數據可以從我的網盤下載。密碼:6ivh
觀察文件
使用 excel 打開文件:
這是 2004 - 2010 點的道指成分股數據。這個數據需要注意日期并不是我們習慣的 ‘yyyy-mm-dd’ 格式,而是 ‘dd-mm-yy’ 格式,要不然你會覺得非常奇怪,數據是怎么個排列法?其實我也是在讀了很多次,發現數據不對時才意識到這一點。所以看文件真應該認真看文件名,笑哭。
數據讀取
打開所讀取的數據,認真一看發現數據時間格式有點奇怪:
其實結果也不怎么奇怪如果,你一開始就是以 ‘dd-mm-yy’ 格式去理解數據,而不是以 ‘yyyy-mm-dd’。請原諒我的愚蠢。
言歸正傳,即便如此這樣的數據看上去也很不舒服,何況如果我們要畫帶有 datetime 軸的圖,那么簡直無法忍受。
如果你這么寫代碼
close all clear clcfilename = 'Dow2004-2010.csv'; formats = ['%D',repmat('%f',1,30)]; fid = fopen(filename,'r'); title = textscan(fid,repmat('%s',1,31),1,'delimiter',','); DowJonesTable = textscan(fid,formats,'delimiter',',','collectoutput',1); fclose(fid)接下來,將看到 DowJonesTable 是一個 1 × 2 的 cell 數組。顯然 cell(1) 是時間,打開一看。
真是一個悲傷的消息,時間還是不對。這里與前文埋下的伏筆呼應,其實不是 matlab 的錯,而是數據本身的問題,滑稽。
也許此時,你靈機一動,格式控制符 %D 之前不是可以加修飾符控制,時間格式嗎?我們在前面,對時間加以控制就行,真是機智。
close all clear clcfilename = 'Dow2004-2010.csv'; formats = ['%{dd-mm-yy}D',repmat('%f',1,30)]; fid = fopen(filename,'r'); title = textscan(fid,repmat('%s',1,31),1,'delimiter',','); DowJonesTable = textscan(fid,formats,'delimiter',',','collectoutput',1); fclose(fid);然而事實相當無情,matlab 報錯:
Error using textscan Unable to read the DATETIME data with the format 'dd-mm-yy'. If the data is not a time, use %q to get text data. Error in newtest (line 9) DowJonesTable = textscan(fid,formats,'delimiter',',','collectoutput',1);其實,這種情況下 matlab 支持的 format 格式相當有限,基本就是:
此路不通,年輕人。不過真希望,matlab 以后增加這種格式控制,我就不用浪費,腦細胞了,滑稽。
通過前面,兩種方法的嘗試。我們意識到讀取數據方面是不能改變現狀。或許,你會想干脆以字符方式讀入數據,然后在利用 datenum 之類的進行轉換,但是 如果你以 字符形式讀入,那么數據就真成 ‘yyyy-mm-dd’ 形式。
人生真是艱難,我們該如何是好?或許就只能篡改數據了,我真的不想這樣做,我不是那種人,都是被逼的,滑稽。
修正時間
修正時間的方式應該不少,我這里提供一種辦法。思路很簡單,通過觀察發現時間是不對,但是也就是差了 2000 年而已,實在不算什么,滑稽。補上就是。
close all clear clc% load data filename = 'Dow2004-2010.csv'; table = readtable(filename); % data cleaning % time werid_date = table.Date; werid_date = cellstr(werid_date); n = length(werid_date); correct_date = nan(n,1); correct_ind = zeros(n,1); for i = 1:nif ~isnat(table.Date(i))temp = datenum(werid_date(i),'dd/mm/yyyy');correct_ind(i) = 1;correct_date(i) = addtodate(temp,2000,'year');end end correct_ind = logical(correct_ind); table = table(correct_ind,:); correct_date = correct_date(correct_ind,:);相信你一看就懂,我這里提幾個值得注意的函數。cellstr 好東西別用錯,isnat 判斷非時間。主力是 addtodate 加 2000 年就是他干的。
修正后的時間另人賞心悅目:
如果沒有辦法一眼讀懂是什么的話,老老實實用 datestr 將時間轉換成字符形式。
就是這樣。
感謝閱讀,好好學習,天天向上
總結
以上是生活随笔為你收集整理的matlab从csv文件中读取时间转换异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat8启动不了的问题
- 下一篇: 蔡氏混沌matlab,蔡氏混沌电路的MA