有效地合并mathematica中的时间序列

时间:2011-06-17 13:35:41

标签: dataset wolfram-mathematica time-series

我想要实现的目标似乎足够普通,以便有一个有效的解决方案。

我正在使用并且我有{{date1,value1},{date1,value1} ...}类型的许多不同 - 您可以传递给DateListPlot的排序

然而,问题是这些只有部分重叠(有些可能有95-2004的数据,有些可能是1999年至2011年等等)

现在我希望能够做到的是将这些合并到一个大的列表中,并使用共同的时间轴,即所有可用日期的Union []。然后会有值的数组,但是没有数据的零。

有没有一种有效的方法来实现这一目标?我有数百个这样的时间序列,制作一些循环整个事情的东西可能效率不高(甚至做起来也很繁琐)

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

例如,

ClearAll[l1, l2];
l1 = {{date1, value1}, {date1, value2}, {date2, value3}, {date4, value4}}
l2 = {{date3, value5}, {date4, value5}, {date1, value6}}

然后

DeleteDuplicates[Union[l1, l2], #1[[1]] \[Equal] #2[[1]] &]

收益{{date1, value1}, {date2, value3}, {date3, value5}, {date4, value4}}。这意味着如果您有相同日期的两个数据点,并且它们不同,则会丢失一个。 (这对我来说)这是不是你需要与否,所以也许你可以添加更多细节。

另一方面,这个

Transpose[{DeleteDuplicates[Last@Last@Reap@Scan[Sow[#[[1]]] &, Union[l1, l2]]],
 Last@Reap[Scan[Sow[#[[2]], #[[1]]] &, Union[l1, l2]]]}]

消除重复的标题并收集每个标题下的值:

{{date1, {value1, value2, value6}}, 
 {date2, {value3}}, 
 {date3, {value5}}, 
 {date4, {value4, value5}}} 

(即,它收集每个日期的所有值)。

你想要的一些例子会很好。

答案 1 :(得分:2)

如果我理解你的问题,你想要

l1 = {{date1, value1}, {date1, value2}, {date2, value3}, {date4, value4}}
l2 = {{date3, value5}, {date4, value5}, {date5, value6}}

成为

l1 = {{date1, value1}, {date1, value2}, 
     {date2, value3}, {date3, 0}, {date4, value4}, {date5,0}}
l2 = {{date1, 0}, {date2, 0}, {date3, value5}, {date4, value5}, {date5, value6}}

如果是这样,这样的事情可能有效:

If[MemberQ[l1[[All,1]],#],Cases[l1,{#,_}],{#,0}]& /@ Union[l1[[All,1]],l2[[All,2]] ]

根据您希望如何处理给定系列中同一日期的多个数据点,您可能需要在Cases []函数之前使用Sequence @@或First @,例如

If[MemberQ[l1[[All,1]],#],Sequence @@ Cases[l1,{#,_}],{#,0}]& /@   
  Union[l1[[All,1]],l2[[All,1]] ]

我现在回家,因此检查了这个语法错误: - )

答案 2 :(得分:0)

谢谢你们。我最终自己做了解决方案,我采用了所有时间表的联合。保存在让我们说日期范围我然后以下列方式使用Mapthread

daterange= Union[DatesOfFirstTimeseries,DatesOfSecondTimeseries];

NewVersionOfFirstTimeSeries = (daterange /. 
     MapThread[Rule, {DatesOfFirstTimeseries, ValuesOfFirstTimeseries}] /. 
    MapThread[
     Rule, {daterange, Table[Indeterminate, {Length[daterange]}]}]);

NewVersionOfSecondTimeSeries = (daterange /. 
     MapThread[Rule, {DatesOfSecondTimeseries, ValuesOfSecondTimeseries}] /. 
    MapThread[
     Rule, {daterange, Table[Indeterminate, {Length[daterange]}]}]);

tjis做了我需要的,但它确实伤害了我对事物的美学观点。