任选两个城市,从天气后报网(只需要给出示例代码):获取某一年的历史天气信息,包括每天最高气温、最低气温、天气状况、风向等,完成以下功能: (1)将获取的数据信息存储到csv格式的文件中,文件命名为”城市名称.csv”,其中每行数据格式为“日期,最高温,最低温,天气,风向”; (2)在数据中增加“平均温度”一列,其中:平均温度=(最高温+最低温)/2,在同一张图中绘制两个城市一年平均气温走势折线图; (3)统计两个城市各类天气的天数,并绘制条形图进行对比; (4)统计这两个城市每个月的平均气温,绘制折线图; (5)统计出这两个城市一年中,平均气温在10~25度,风力小于5级的天数; (6)自定义标准,分析这两个城市适合旅游的季节。
时间: 2024-02-22 11:01:03 浏览: 139
获取城市天气
以下是以北京和上海为例,获取2020年历史天气信息并完成上述功能的代码:
```python
import requests
import csv
import pandas as pd
import matplotlib.pyplot as plt
# 获取历史天气信息
def get_weather(city, year):
url = "http://www.tianqihoubao.com/lishi/" + city + "/month/" + year + ".html"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
response = requests.get(url, headers=headers)
response.encoding = "gb2312"
html = response.text
df = pd.read_html(html, header=0, encoding="gb2312")[0]
return df
# 存储数据到csv文件
def save_to_csv(city, df):
df.to_csv(city + ".csv", index=False)
# 计算平均温度并增加到数据中
def add_mean_temperature(df):
df["平均温度"] = (df["最高气温"] + df["最低气温"]) / 2
# 绘制平均气温走势折线图
def plot_mean_temperature(city1, df1, city2, df2):
plt.plot(df1["日期"], df1["平均温度"], label=city1)
plt.plot(df2["日期"], df2["平均温度"], label=city2)
plt.xlabel("日期")
plt.ylabel("平均气温(℃)")
plt.title(city1 + "和" + city2 + "一年平均气温走势")
plt.legend()
plt.show()
# 统计各类天气的天数并绘制条形图
def plot_weather_count(city1, df1, city2, df2):
weather_count1 = df1["天气"].value_counts()
weather_count2 = df2["天气"].value_counts()
weather_count = pd.concat([weather_count1, weather_count2], axis=1)
weather_count.columns = [city1, city2]
weather_count.plot(kind="bar")
plt.xlabel("天气")
plt.ylabel("天数")
plt.title(city1 + "和" + city2 + "各类天气天数对比")
plt.show()
# 统计每个月的平均气温并绘制折线图
def plot_monthly_mean_temperature(city1, df1, city2, df2):
df1["月份"] = df1["日期"].apply(lambda x: str(x)[5:7])
df2["月份"] = df2["日期"].apply(lambda x: str(x)[5:7])
monthly_mean_temperature1 = df1.groupby("月份").mean()["平均温度"]
monthly_mean_temperature2 = df2.groupby("月份").mean()["平均温度"]
monthly_mean_temperature = pd.concat([monthly_mean_temperature1, monthly_mean_temperature2], axis=1)
monthly_mean_temperature.columns = [city1, city2]
monthly_mean_temperature.plot(kind="line")
plt.xlabel("月份")
plt.ylabel("平均气温(℃)")
plt.title(city1 + "和" + city2 + "每月平均气温")
plt.show()
# 统计符合条件的天数
def count_suitable_days(df):
suitable_days = df[(df["平均温度"] >= 10) & (df["平均温度"] <= 25) & (df["风力"] < 5)]
return len(suitable_days)
# 分析适合旅游的季节
def analyze_season(city, df):
# 自定义标准:平均气温在20℃以上且降水量较少的季节
df["季节"] = df["日期"].apply(lambda x: "春季" if x.month in [3, 4, 5] else ("夏季" if x.month in [6, 7, 8] else ("秋季" if x.month in [9, 10, 11] else "冬季")))
season_count = df.groupby("季节").mean()[["平均温度", "降水量"]]
suitable_season = season_count[(season_count["平均温度"] >= 20) & (season_count["降水量"] < 50)].index[0]
return city + "适合旅游的季节为:" + suitable_season
# 获取历史天气信息
beijing_weather = get_weather("beijing", "2020")
shanghai_weather = get_weather("shanghai", "2020")
# 存储数据到csv文件
save_to_csv("北京", beijing_weather)
save_to_csv("上海", shanghai_weather)
# 计算平均温度并增加到数据中
add_mean_temperature(beijing_weather)
add_mean_temperature(shanghai_weather)
# 绘制平均气温走势折线图
plot_mean_temperature("北京", beijing_weather, "上海", shanghai_weather)
# 统计各类天气的天数并绘制条形图
plot_weather_count("北京", beijing_weather, "上海", shanghai_weather)
# 统计每个月的平均气温并绘制折线图
plot_monthly_mean_temperature("北京", beijing_weather, "上海", shanghai_weather)
# 统计符合条件的天数
suitable_days_beijing = count_suitable_days(beijing_weather)
suitable_days_shanghai = count_suitable_days(shanghai_weather)
print("北京和上海一年中,平均气温在10~25度,风力小于5级的天数分别为:", suitable_days_beijing, suitable_days_shanghai)
# 分析适合旅游的季节
print(analyze_season("北京", beijing_weather))
print(analyze_season("上海", shanghai_weather))
```
注意:由于天气后报网的网页结构可能会变化,以上代码仅供参考,具体实现可能需要根据当前网页结构进行适当修改。
阅读全文