2011-06-17 63 views
4

什么,我试图完成的似乎不够有普通的是一个有效的解决方案。时间序列有效

我使用的是,我有许多不同的 {{date1,value1},{date1,value1} ...}类型 - 您可以传递给DateListPlot的类型。

然而,问题是,这些仅部分重叠(一些国家可能从95-2004有数据,有2099至11年等)

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

有没有做到这一点的有效途径?我有数百个这样的时间序列,并进行一些循环,整个事情可能不是非常有效的(甚至相当繁琐,使)

任何帮助是极大的赞赏!

+1

你能举例输入和输出吗? – acl 2011-06-17 14:15:08

+1

鉴于Mathematica不需要“填充”数据集来将它们绘制在同一张图表上,您是否真的需要这样做?或者你是否要将它导出到类似Excel的Excel中,其中NaN等价物是必需的? – Verbeia 2011-06-17 15:45:28

+0

@Verbeia但它取决于“this”是需要的,不是吗?应该创建缺失的日期并添加0作为数据?创建一些缺失的日期?是否提供了一些日期,但没有数据,如果是,以哪种形式?这将有助于知道! – acl 2011-06-17 15:56:45

回答

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[[email protected]@[email protected][Sow[#[[1]]] &, Union[l1, l2]]], 
[email protected][Scan[Sow[#[[2]], #[[1]]] &, Union[l1, l2]]]}] 

消除重复报头和每个头从而下收集的值:

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

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

你想要将是很好的东西一些例子。

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]] ] 

取决于你如何想被处理在一个给定的系列相同日期的多个数据点,则可能需要先案件[]函数的用Sequence @@或First @例如n

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

我现在在家,所以这一块已被检查语法错误:-)

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做了什么,我需要的,但它确实伤害了我对事物的审美观。