0

我想将 TimeSerie 重新采样到更大的时间粒度。在以下条件下,我不确定在 Deedle 中哪个是最好的方法。

假设我有一个从 2014-03-15 到 2014-09-15 的每日时间序列,生成如下:

var startDate = DateTime.Parse('2014-03-15');
var daily = Enumerable.Range(0, 60)
            .Select(x => KeyValue.Create(startDate.AddDays(x), 15.03))
            .Concat(Enumerable.Range(120, 60)
                    .Select(x => KeyValue.Create(startDate.AddDays(x), 15.03)))
            .ToSeries();

这(或多或少)转化为从 2014 年 3 月 15 日到 2014 年 5 月 15 日的每日时间序列连续体,然后失踪,然后是 2014 年 7 月 15 日到 2014 年 9 月 15 日的连续体。

我想将其汇总为每月时间序列,包括从 2014 年 3 月到 2014 年 9 月,作为下划线的平均值。考虑到它是一个排序的系列,我想避免昂贵的 GroupBy 并使用 Sampling 函数。

我最好的解决方案是:

var monthly = daily.ResampleEquivalence(x => x.FirstDayOfTheMonth(), s => s.Mean());

这将返回一个系列,正确,但缺少关键 2014-06 的数据。

我想使用 ResampleUniform 但在 c# 中没有提供带有回调函数的重载来计算平均值......

关于如何在 C# 中模拟 F# resampleUniformInto 的任何建议?

4

1 回答 1

1

不完全模拟 F# resampleUniformInto 而是作为一种解决方法:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace resample2
{
    class Program
    {
        static void Main(string[] args)
        {
            var startDate = DateTime.ParseExact("2014-03-15", "yyyy-MM-dd", CultureInfo.InvariantCulture);
            var daily = Enumerable.Range(0, 60)
                        .Select(x => KeyValue.Create(startDate.AddDays(x), 15.03))
                        .Concat(Enumerable.Range(120, 60)
                        .Select(x => KeyValue.Create(startDate.AddDays(x), 15.03)))
                        .ToSeries();

            var monthly = daily.ResampleEquivalence(x => x.ToString("yyyy-MM") , s => s.Mean());

            monthly.Print();

            var keys = Enumerable.Range(0, 360)
                      .Select(x => startDate.AddDays(x).Date)
                      .Where(x => x.Day == 1)
                      .Select(x=> x.ToString("yyyy-MM"));


            var monthly2 = daily.ResampleEquivalence(x => x.ToString("yyyy-MM"), s => s.Mean()).Realign(keys);



            monthly2.Print();

            Console.ReadKey();
        }

    }
}

在此处输入图像描述

于 2015-02-16T00:03:52.290 回答