2014-03-29 29 views
1

我想在Mathematica上編寫一個小腳本,它描繪了我使用Python獲取的一組特定數據。 數據輸出如下: 這是一個標準的日期時間對象被回顯到TSV文件。如何調用需要帶「引號」字符串的函數?

2014-03-29 08:39:37.080834 04 0.403980970383 0.2 
2014-03-29 08:39:39.449200 04 0.383723974228 0.2 
2014-03-29 08:39:42.603058 04 0.475341081619 0.2 
2014-03-29 08:39:44.882941 04 0.303984165192 0.2 
2014-03-29 08:39:47.021998 04 0.312470912933 0.2 
2014-03-29 08:39:48.951891 04 0.312346935272 0.2 

第一列是日期時間對象,時間和日期用空格分隔而不是\ t。接下來的3列是由\ t分隔的列,但與手邊的問題無關(儘管如果有人感興趣,我很樂意告訴他們的意思)。

所以我想要做的是將第一列導入到Mathematica中,這樣我就可以繪製第一列和第二列(即日期和時間(x軸)與04s(y軸,表示事件))。 這樣做我這樣做:

data = Import["/home/pi/Desktop/data.tsv"] 
dates = data[[;;,1]] 
DateList[dates] 

但在最後一行是我得到一個錯誤。我知道一個事實,如果我調用DateList函數並在「引號」中給它一個日期對象,它會起作用,但由於某些原因,這些字符串不在引號中,因此會返回錯誤。該錯誤表示輸入不能被解釋爲日期或時間輸入。

我試過用DateList [日期// InputForm [%]]之類的東西,但它仍然不起作用。

請幫我理解字符串在Mathematica中的工作方式! :)

美聯儲

+0

你並不真的需要數學:你知道蟒蛇可以畫出這樣的數據本身,對不對?有關示例,請參見[本頁](http://matplotlib.org/1.3.1/users/recipes.html#fixing-common-date-annoyances)。 (現在,沒有理由使用Mathematica進行除了一些象徵性數學以外的任何事情,偶爾還會收集其數據,除非你的老闆/教授讓你使用它)。 – Mike

回答

1

日期的字符串格式包括「 - 」和「」和「:」。 Datelist的文檔聲稱你應該能夠給它一個格式字符串並讓它從一個字符串中提取一個日期,但是一再試圖讓它工作失敗。仔細研究文檔的細節,看看你是否可以給它一個有效的字符串格式。或者只是做一個小小的字符串黑客攻擊,並提取自己的領域,並完成它。

In[1]:= data = Import["data.tsv"]; 
dates = data[[;; , 1]]; 
fixeddates = Map[ToExpression["{" <> StringReplace[#, 
    {"-" -> ",", " " -> ",", ":" -> ","}] <> "}"] &, dates] 

Out[3]= {{2014, 3, 29, 8, 39, 37.0808}, {2014, 3, 29, 8, 39, 39.4492}, 
    {2014, 3, 29, 8, 39, 42.6031}, {2014, 3, 29, 8, 39, 44.8829}, 
    {2014, 3, 29, 8, 39, 47.022}, {2014, 3, 29, 8, 39, 48.9519}} 

其中每個日期現在是一個數字列表。

啊,讓格式化字符串工作的一點點進展。這工作

In[18]:= DateList[{"2014-03-29 08:39:48", {"Year", "-", "Month", 
    "-", "Day", " ", "Hour", ":", "Minute", ":", "Second"}}] 

Out[18]= {2014, 3, 29, 8, 39, 48.} 

但這並不即使文件說,「日,小時,分鐘和秒值可nonintegers

In[19]:= DateList[{"2014-03-29 08:39:48.951891", {"Year", "-", "Month", 
    "-", "Day", " ", "Hour", ":", "Minute", ":", "Second"}}] 

During evaluation of In[19]:= DateString::str: String 2014-03-29 08:39:48.951891 cannot be interpreted as a date in format {Year,-,Month,-,Day, ,Hour,:,Minute,:,Second}. >> 

Out[19]= DateList[{"2014-03-29 08:39:48.951891", {"Year", "-", 
"Month", "-", "Day", " ", "Hour", ":", "Minute", ":", "Second"}}] 

所以Datelist將提取整秒,但不是真正的秒: 「

除非別人能夠想出一個真正看起來像一個bug的好解釋。

編輯展示瞭如何繪製隨後萬一數據

data = Import["data.tsv"]; 
points = data[[All, {1, 3}]]; (*extract date and 3rd column*) 
fixedpoints = Map[{ToExpression["{" <> StringReplace[First[#], 
    {"-" -> ",", " " -> ",", ":" -> ","}] <> "}"], Last[#]} &, points]; 
DateListPlot[fixedpoints, PlotStyle -> PointSize[0.02]] 

...PlotSnipped... 
+0

這非常有趣!非常感謝你! 如何繪製數據?我試過調用DatePlotList函數,但它仍然只返回數字列表。我相信它需要它們在DateList對象中。我想我會嘗試將秒截斷爲整數秒。但我仍然不知道如何在數字周圍添加引號。 – ch0l1n3

+1

編輯包含您的陰謀 – Bill

+0

這太棒了!有用!那正是我想要做的。出於某種原因,我無法將這兩個列表結合起來,以至於您有{{year,month,day},event} 我不知道該怎麼做。 再次感謝! – ch0l1n3

1

我沒有與任何數學的經驗,但它應該是很容易確保每個日期的周圍有引號:

data = Import["/home/pi/Desktop/data.tsv"] 
dates = data[[;;,1]] 
dates = ['"' + date + '"' for date in dates] 
DateList[dates] 

FYI我假設dates中的每個日期都是一個字符串。

相關問題