我有多个时间序列(例如下面的例子)。我需要扫描这些多个列表并构建缺失值列表。有人可以建议一种方法吗?
public class TimeSeries
{
public int GroupId { get; set; }
public DateTime DateTime { get; set; }
public double Value { get; set; }
}
我有3个列表(缩写到下表中);每个系列都有相同的日期时间和时间。它的价值。因此gp1Series将具有datetime和value1,gp2Series将具有相同的datetime和value2,并且gp3Series将具有相同的datetime和value3。
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.但是31/01/2014 05:00将不需要添加到新列表中因为value3不为零。
有什么建议吗?
答案 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 }
,或者只是在第二种情况下删除投影。