在c#中管理时间序列

时间:2012-01-29 11:15:54

标签: c# datetime collections time-series

我希望根据您对c#中管理时间序列的最佳方式有所了解。我需要一个2维矩阵 - 与Datetime对象一样作为行的索引(有序且无重复),每列代表相关日期时间的股票价值。我想知道是否有任何这些对象能够处理日期的缺失数据:添加列或时间系列会在行索引中添加缺少的日期并添加" null"或" N / a"对于现有日期的缺失值。

与c ++相比,c#已有很多东西可供使用,我不想错过任何明显的东西。

4 个答案:

答案 0 :(得分:4)

您可以使用日期和股票价值之间的映射,例如Dictionary<DateTime, decimal>。这样日期可能很稀疏。

如果您需要在每个日期多个股票的价格,而不是每个日期都显示每个股票,那么您可以选择Dictionary<DateTime, Dictionary<Stock, decimal>>Dictionary<Stock, Dictionary<DateTime, decimal>>,具体取决于以后如何访问这些值(如果你不介意两次存储值,甚至两者都有)。

答案 1 :(得分:3)

TeaFiles.Net 是一个用于平面文件中时间序列存储的库。据我所知,您只想将数据存储在内存中,在这种情况下,您将使用MemoryStream并将其传递给ctor。

// the time series item type
struct Tick
{
    public DateTime Time;
    public double Price;
    public int Volume;
}

// create file and write some values
var ms = new MemoryStream();
using (var tf = TeaFile<Tick>.Create(ms))
{
    tf.Write(new Tick { Price = 5, Time = DateTime.Now, Volume = 700 });
    tf.Write(new Tick { Price = 15, Time = DateTime.Now.AddHours(1), Volume = 1700 });
    // ...
}

ms.Position = 0; // reset the stream

// read typed
using (var tf = TeaFile<Tick>.OpenRead(ms))
{
    Tick value = tf.Read();
    Console.WriteLine(value);
}

https://github.com/discretelogics/TeaFiles.Net

您可以通过NuGet包管理器“TeaFiles.Net”安装库 VS画廊中也提供了vsix示例项目。

答案 2 :(得分:0)

C#中的DateTime对象是一个值Type,这意味着它使用默认值进行初始化,即Day = 1 Month = 1 Year = 1 Hour = 1 Minute = 1 Second = 1。 (或者是小时= 12,我不太确定)。

如果我理解正确,您需要一个数据结构,该数据结构包含以某种方式排序的DateTime对象,当您插入新对象时,相邻的dateTime对象将更改为保留您的订单。

在这种情况下,我将关注数据结构而不是dateTime对象。

写一个继承自Lits&lt;&gt;的简单类例如,在插入或删除操作中包含所需的功能。

类似的东西:

public class DateTimeList : List<DateTime> {

public void InsertDateTime (int position, DateTime dateTime) {

    // insert the new object
    this.InsertAt(position, dateTime)

    // then take the adjacent objects (take care of integrity checks i.e.
    // exists the index/object? in not null ? etc.        

    DateTime previous = this.ElementAt<DateTime>(position - 1);

    // modify the previous DateTime obejct according to your needs.

    DateTime next = this.ElementAt<DateTime>(position + 1);

    // modify the next DateTime obejct according to your needs.    

}
}

答案 3 :(得分:0)

正如您在对Marc的回答的评论中提到的,我认为SortedList是保存时间序列数据的更合适的结构。

<强>更新

正如zmbq在对Marc的问题的评论中提到的,SortedList是作为一个数组实现的,所以如果需要更快的插入/删除时间,那么SortedDictionary将是更好的选择。

请参阅Jon Skeet对this question的回答,了解性能差异的概述。