查找基于日期的平均值
本文关键字:平均值 日期 于日期 查找 | 更新日期: 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天。