Weather forecast printing
To save a few lines create a Style enum first:

enum Style 
{
    Header,
    Hour,
    Condition,
    Temperature
}


Then assign each style a color:

static Dictionary&lt;Style, ConsoleColor&gt; _styles = new Dictionary&lt;Style, ConsoleColor&gt;
{
    [Style.Header] = ConsoleColor.Magenta,
    ...
}


Use overloading to encapsulate the styling logic like this:

private static void Print(Style style, string format, params object[] args)
{
    Console.ForegroundColor = _styles[style];
    Console.Write(format, args);
    Console.ResetColor();   
}

private static void PrintLine(Style style, string format, params object[] args)
{
    Print(style, format, args);
    Console.WriteLine();
}


I think it's a good idea to stick to the Print &amp; PrintLine convention like the console does it.

Then you can turn this:


 ChangeColor(ConsoleColor.Magenta);
 Console.WriteLine("== Day {0} ==", printDate.ToLongDateString());



into:

Print(Style.Header, "== Day {0} ==", printDate.ToLongDateString());


You can go even further and create a special method called PrintHeader and do all the magic there like so:

PrintHeader(printDate)
{
    Print(Style.Header, "== Day {0} ==", printDate.ToLongDateString());
}


This way your printing becomes even cleaner and you can manipulate the header separately.

The same applies for other cases.




 DateTime printDate = DateTime.Now.Date;
 for (int i = 0; i &lt; days; i++)
 {
     printDate = printDate.AddDays(1);
     ...
 }



I would remove the helper above the loop and write:

 for (int i = 0; i &lt; days; i++)
 {
     var printDate = DateTime.Now.Date.AddDays(i + 1);
     ...
 }


Magic numbers

You should replace all those 5, 6, 21 etc with constants and give them proper names. I have no idea what they mean. You in few week will wonder too why such numbers.




 if (weatherAtHour != null)    {
 }



make it 

if (weatherAtHour == null) { continue; }


to reduce nesting.



for (int hour = 6; hour &lt;= 21; hour = hour + 3)

I would encapsulate this logic in a method like this:

private static IEnumerable&lt;int&gt; Hours()
{
    for (int hour = 6; hour &lt;= 21; hour = hour + 3)
    {
        yield return hour;
    }
}


Then in your weather print you can use link with ease:

var weathersAtHour = 
    Hours()
    .Select(hour =&gt; timePointsDuringtDay.SingleOrDefault(weatherTimePoint =&gt; weatherTimePoint.TimePoint.Hour == hour))
    .Where(x =&gt; x != null);

foreach (var weatherAtHour in weathersAtHour)
{
   ...
}