This looks like a problem of "The Weather Channel." Yahoo Weather just pulls the data form it, and you can't do a thing when its data is incorrect in the first place. Unless someone fixes this in The Weather Channel, it is what it is now.
As to your calendar problem, try the script below instead. The problem of your calendar script is that it substitutes the first "20" it finds, and in this case, it replaces "20" of "2011."
cal | sed -E '1,$'"s/( |^)($(date +%e))( |$)/\1$(echo '\033[7;30m')\2$(echo '\033[0m')\3/"