查找基于日期的平均值

本文关键字:平均值 日期 于日期 查找 | 更新日期: 2023-09-27 18:01:17

我需要找到与日期相关的平均值。我有以下的东西,需要找到2015/05/01的平均运行值,也就是50,那么我该如何编程呢?

double value = 0;
DateTime firstdate = Convert.ToDateTime("2015/02/01");
value = 20;
DateTime lastdate = Convert.ToDateTime("2015/06/01");
value = 60;

查找基于日期的平均值

所以基本上你需要一个日期之间的线性插值。

使用

:

static public double LinearInterpolation(double newOaDate, double firstOaDate, double lastOaDate, double firstValue, double lastValue)
{
    if ((lastOaDate - firstOaDate) == 0)
    {
        return (firstValue + lastValue) / 2;
    }
    else
    {
        return firstValue + (newOaDate - firstOaDate) * (lastValue - firstValue) / (lastOaDate - firstOaDate);
    }
}

用法:

DateTime firstDate = Convert.ToDateTime("2015/02/01");
double firstValue = 20;
DateTime lastDate = Convert.ToDateTime("2015/06/01");
double lastValue = 60;
DateTime newDate = Convert.ToDateTime("2015/05/01");
double newValue = LinearInterpolation(newDate.ToOADate(), firstDate.ToOADate(), lastDate.ToOADate(), firstValue, lastValue);
// RESULT: newValue = 49.666666666666671

那么为什么newValue = 49.666666666666671 ?因为不是每个月都有30天,所以不是每个月的1号都是等距的。

如果你想得到确切的50,那么你将被迫使用月份值,并以一种智能的方式使用线性插值(myDate.Month或类似的)。线性插值链接:c#线性插值

由于信息有限,所以我选择使用线性公式

功能:

private static double Calculate(KeyValuePair<DateTime, double> startDate, KeyValuePair<DateTime, double> endDate, DateTime targetDate)
    {
        // It's X.
        var days = (endDate.Key - startDate.Key).TotalDays;
        // It's Y.
        var value = (endDate.Value - startDate.Value);
        // You get the value of slope here.
        var slope = value / days;
        // Suppose x == 0 (change linear starting point to (0,0) in other word change starting date to date 0).
        var constant = startDate.Value;
        var daysToFind = (targetDate - startDate.Key).TotalDays;
        return (slope * daysToFind) + constant;
    }

用法:

        CultureInfo culture = new CultureInfo("en-US");
        var firstDate = new KeyValuePair<DateTime, double>(Convert.ToDateTime("2015/02/01", culture), 20);
        var lastDate = new KeyValuePair<DateTime, double>(Convert.ToDateTime("2015/06/01", culture), 60);
        var targetDate = Convert.ToDateTime("2015/05/01", culture);
        var result = Calculate(firstDate, lastDate, targetDate);

有了这个,你可以预测任何一天你想要的任何值(通过非常不确定的线性公式)。

就像上面的答案。结果值为49.6666666666671,因为一个月的天数不完全是30天。