日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab从csv文件中读取时间转换异常

發布時間:2023/12/14 循环神经网络 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab从csv文件中读取时间转换异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

matlab 從 csv 文件中讀取時間轉換異常

最近一段時間一直在研究 matlab 讀取各種數據,自以為文件讀取的水平還行。可是,昨天,幫朋友讀取一個 csv 文件時,時間轉換卻讓我感到非常奇怪。無情打臉,滑稽。

本文所需要用到的數據可以從我的網盤下載。密碼:6ivh

觀察文件

使用 excel 打開文件:


這是 2004 - 2010 點的道指成分股數據。這個數據需要注意日期并不是我們習慣的 ‘yyyy-mm-dd’ 格式,而是 ‘dd-mm-yy’ 格式,要不然你會覺得非常奇怪,數據是怎么個排列法?其實我也是在讀了很多次,發現數據不對時才意識到這一點。所以看文件真應該認真看文件名,笑哭。

數據讀取

  • 最簡單的方式是用函數 readtable 直接讀取,數據被轉換成 table 形式。
  • close all clear clcfilename = 'Dow2004-2010.csv'; DowJonesTable = readtable(filename);

    打開所讀取的數據,認真一看發現數據時間格式有點奇怪:


    其實結果也不怎么奇怪如果,你一開始就是以 ‘dd-mm-yy’ 格式去理解數據,而不是以 ‘yyyy-mm-dd’。請原諒我的愚蠢。

    言歸正傳,即便如此這樣的數據看上去也很不舒服,何況如果我們要畫帶有 datetime 軸的圖,那么簡直無法忍受。

  • 一開始我以為是 readtable 這個函數太高級了,轉換出錯。笑哭,真的不要亂懷疑 matlab 年輕人,犯錯的一般都是你自己。于是我決定用比較低級的方式讀取數據。
  • 如果你這么寫代碼

    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文件中读取时间转换异常的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。