我有一个算法,它扫描从 .csv 文件(大约 3700 行)读取的数据,并通过为当年的每个星期日运行 count++ 并将计数值指定为来评估每个条目在一年中的哪个交易周当日期在该周内时的交易周。
它工作正常,但性能滞后。这是使用 Task.Factory.StartNew 运行的第三个函数(我也尝试过 parallel.Invoke)。
时序测试结果。
之前:00:00:05.58
之后:00:00:23.27
更新
在设置每个交易周后添加休息时间。时间有所改善,但仍然很慢。
新时间:00:00:15.74
出于我们的目的,一年中的第一个星期是第 1 周(不是第 0 周),定义为从一年中的第一天到星期日。如果一年的第一天是星期日,则第 1 周的长度为 1 天。
private void SetDefiniteWeeks()
{
string FileLoc = FilePath + Market + ".csv";
string[] Data = File.ReadAllLines(FileLoc);
var FileData = from D in Data
let DataSplit = D.Split(',')
select new
{
Date = DateTime.Parse(DataSplit[0]),
ClosingPrice = double.Parse(DataSplit[4])
};
//assign each date to it's relevant week
TradingWeek TW;
List<TradingWeek> tradingWeek = new List<TradingWeek>();
foreach (var pe in FileData)
{
// DateTime dt = pe.Date;
int Year = pe.Date.Year;
string End_of_Week = "Sunday";
int WeekCount = 0;
DateTime LoopDate_Begin = new DateTime(Year,1,1);
DateTime LoopDate_End = new DateTime(Year,12,31);
do
{
if (LoopDate_Begin.DayOfWeek.ToString() == End_of_Week)
{
WeekCount++;
if (LoopDate_Begin.DayOfYear > pe.Date.DayOfYear && LoopDate_Begin.DayOfYear < (pe.Date.DayOfYear + 7))
{
TW = new TradingWeek { Week = WeekCount, Date = pe.Date };
tradingWeek.Add(TW);
break;
}
}
LoopDate_Begin = LoopDate_Begin.AddDays(1);
} while (LoopDate_Begin.Date.ToString() != LoopDate_End.Date.ToString());
}
}
请帮忙。
更新
新时代
00:00:06.686
巨大的进步。感谢大家的帮助。
修改后的代码:
CalendarWeekRule cw = CalendarWeekRule.FirstDay;
var calendar = CultureInfo.CurrentCulture.Calendar;
var trad_Week = (from pe in FileData
select new TradingWeek
{
Date = pe.Date,
Week = (calendar.GetWeekOfYear(pe.Date, cw,DayOfWeek.Sunday))
}).ToList();
最佳答案
我不确定这是否是您想要的,但在阅读评论后我觉得这可能有效(?)
var calendar = CultureInfo.CurrentCulture.Calendar;
var tradingWeek = (from pe in FileData
select new TradingWeek
{
Date = pe.Date,
Week = calendar.GetWeekOfYear(pe.Date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
}).ToList();
编辑:更改为 CalendarWeekRule.FirstDay 因为它是(更多?)OP 正在寻找的东西。
关于wpf - "Week of the year"算法需要改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3355137/