2014-02-05 18 views
0

我有多個時間序列(下面的示例)。我需要掃描這些多個列表並建立缺失值列表。有人可以建議一種方法嗎?通過掃描多個集合生成缺失值列表

public class TimeSeries 
    { 
     public int GroupId { get; set; } 

     public DateTime DateTime { get; set; }  

     public double Value { get; set; } 
    } 

我有3個列表(縮寫到下表);每個系列會有相同的日期時間&它的價值。所以gp1Series將有datetime和value1,gp2Series將具有相同的日期時間和值2,並且gp3Series將具有相同的日期時間和值3。

Date   Value1 Value2 Value3 
30/01/2014 23:00 748 -1 1 
30/01/2014 23:30 747 1 1 
31/01/2014 00:00 746 1 1 
31/01/2014 00:30 745 1 1 
31/01/2014 01:00 745 1 1 
31/01/2014 01:30 744 1 1 
31/01/2014 02:00 743 1 1 
31/01/2014 02:30 0 0 0 
31/01/2014 03:00 743 1 1 
31/01/2014 03:30 742 1 1 
31/01/2014 04:00 741 1 1 
31/01/2014 04:30 740 1 1 
31/01/2014 05:00 0 0 1 

只有當同一日期時間全部3個值有值0,我需要將它們添加到一個新的列表。因此,在上面的例子中,31/01/2014 2:30將需要被添加到新列表中,因爲所有列表的值爲0.然而,2014年1月31日05:00將不需要被添加到新列表中因爲value3不是零。

有什麼建議嗎?

+1

我會建議3個列表的聯合,然後在'Date'上分組,然後做一個'Count',其中每個分組的值== 0。我會添加一個答案,但我正在旅行,並通過電話添加。希望這有助於 –

回答

3

你可以得到的DateTime這在所有三個列表零個值:

from v1 in gp1Series 
join v2 in gp2Series on v1.DateTime equals v2.DateTime 
join v3 in gp3Series on v2.DateTime equals v3.DateTime 
where v1.Value == 0 && v2.Value == 0 && v3.Value == 0 
select v1.DateTime 

另一種方法(由@jim啓發)

gp1Series.Where(ts => ts.Value == 0) 
     .Concat(gp2Series.Where(ts => ts.Value == 0)) 
     .Concat(gp3Series.Where(ts => ts.Value == 0)) 
     .GroupBy(ts => ts.DateTime) 
     .Where(g => g.Count() == 3) 
     .Select(g => g.Key) 

如果需要TimeSeries情況下,您可以在選擇new { v1, v2, v3 }第一種情況,或者乾脆在第二種情況下移除投影。

+1

+1 sergey,這是'there thereabouts'我如何接近它:-) –