Add 3-Day Outlook generation
This commit is contained in:
@@ -100,6 +100,62 @@ func BuildDailySummary(bundle *Bundle, date time.Time, location *time.Location,
|
||||
return summary, nil
|
||||
}
|
||||
|
||||
func BuildPeriodDailySummaries(bundle *Bundle, period timeutil.Period, location *time.Location, dayparts []DaypartDefinition) ([]DailySummary, error) {
|
||||
if !period.IsValid() {
|
||||
return nil, fmt.Errorf("valid forecast period is required")
|
||||
}
|
||||
if location == nil {
|
||||
location = time.UTC
|
||||
}
|
||||
var summaries []DailySummary
|
||||
for day := timeutil.CivilDay(period.Start, location); day.Start.Before(period.End); day = timeutil.CivilDay(day.Start.AddDate(0, 0, 1), location) {
|
||||
overlap, ok := day.Intersection(period)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
summary, err := buildDailySummaryForPeriod(bundle, overlap, location, dayparts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
summaries = append(summaries, *summary)
|
||||
}
|
||||
return summaries, nil
|
||||
}
|
||||
|
||||
func buildDailySummaryForPeriod(bundle *Bundle, period timeutil.Period, location *time.Location, dayparts []DaypartDefinition) (*DailySummary, error) {
|
||||
if bundle == nil {
|
||||
return nil, fmt.Errorf("forecast bundle is required")
|
||||
}
|
||||
if bundle.Hourly == nil || len(bundle.Hourly.Periods) == 0 {
|
||||
return nil, fmt.Errorf("hourly forecast data is required")
|
||||
}
|
||||
windows, err := ResolveDayparts(period.Start, location, dayparts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
alerts := AlertOverlaps(bundle.Alerts, period)
|
||||
summary := &DailySummary{
|
||||
Date: period.Start.In(location).Format(timeutil.DateLayout),
|
||||
Period: period,
|
||||
NarrativePeriods: SelectNarrativePeriods(bundle, period),
|
||||
AlertOverlaps: alerts,
|
||||
Discussion: SelectDiscussion(bundle),
|
||||
SourceWarnings: bundle.Warnings,
|
||||
SourceProvenance: bundle.Sources,
|
||||
}
|
||||
for _, window := range windows {
|
||||
clipped, ok := window.Period.Intersection(period)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
periods := SelectHourlyPeriods(bundle.Hourly, clipped)
|
||||
daypartSummary := SummarizeDaypart(window.Name, clipped, periods)
|
||||
daypartSummary.AlertOverlaps = overlapsWithin(alerts, clipped)
|
||||
summary.Dayparts = append(summary.Dayparts, daypartSummary)
|
||||
}
|
||||
return summary, nil
|
||||
}
|
||||
|
||||
func SelectHourlyPeriods(run *ForecastRun, period timeutil.Period) []ForecastPeriod {
|
||||
if run == nil {
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user