2014-03-29 28 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中的每个日期都是一个字符串。

相关问题