parent
e2dcf80fca
commit
fdfca49bc8
@ -0,0 +1,113 @@
|
||||
import requests
|
||||
from lxml import etree
|
||||
import csv
|
||||
from collections import Counter
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
|
||||
def getweather(url):
|
||||
weather_info = []
|
||||
high_temps = [] # 存储最高气温
|
||||
low_temps = [] # 存储最低气温
|
||||
weather_conditions = []
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0'
|
||||
}
|
||||
|
||||
response = requests.get(url, headers=headers)
|
||||
html_resp = etree.HTML(response.text)
|
||||
resp_list = html_resp.xpath("//ul[@class='thrui']/li")
|
||||
for li in resp_list:
|
||||
day_weather_info = {}
|
||||
day_weather_info['date_time'] = li.xpath('./div[1]/text()')[0].split(' ')[0]
|
||||
high = li.xpath('./div[2]/text()')[0]
|
||||
high_temp = float(high[:high.find('C')])
|
||||
day_weather_info['high'] = high_temp
|
||||
high_temps.append(high_temp)
|
||||
low = li.xpath('./div[3]/text()')[0]
|
||||
low_temp = float(low[:low.find('C')])
|
||||
day_weather_info['low'] = low_temp
|
||||
low_temps.append(low_temp)
|
||||
day_weather = li.xpath('./div[4]/text()')[0]
|
||||
day_weather_info['weather'] = day_weather
|
||||
weather_conditions.append(day_weather)
|
||||
weather_info.append(day_weather_info)
|
||||
|
||||
return weather_info, high_temps, low_temps, weather_conditions
|
||||
|
||||
|
||||
weathers = []
|
||||
high_temps = []
|
||||
low_temps = []
|
||||
weather_conditions = []
|
||||
|
||||
for month in range(1, 13):
|
||||
weather_time = '2022' + ('0' + str(month) if month < 10 else str(month))
|
||||
url = f'https://lishi.tianqi.com/guilin/{weather_time}.html'
|
||||
weather, highs, lows, conditions = getweather(url)
|
||||
weathers.append(weather)
|
||||
high_temps.extend(highs)
|
||||
low_temps.extend(lows)
|
||||
weather_conditions.extend(conditions)
|
||||
|
||||
with open('weather.csv', 'w', newline='') as csvfile:
|
||||
writer = csv.writer(csvfile)
|
||||
writer.writerow(['日期', '最高气温', '最低气温', '天气'])
|
||||
writer.writerows(
|
||||
[list(day_weather_dict.values()) for month_weather in weathers for day_weather_dict in month_weather])
|
||||
|
||||
weather_counts = Counter(weather_conditions)
|
||||
|
||||
writer.writerow([])
|
||||
writer.writerow(['天气状况', '出现次数'])
|
||||
writer.writerows(weather_counts.items())
|
||||
|
||||
|
||||
def plot_weather_counts(weather_counts):
|
||||
df = pd.DataFrame(list(weather_counts.items()), columns=['天气状况', '出现次数'])
|
||||
|
||||
plt.rcParams['font.sans-serif'] = ['SimHei']
|
||||
|
||||
bar_width = 0.5 # 设置柱子的宽度
|
||||
bar_spacing = 0.3 # 设置柱子之间的间隔
|
||||
|
||||
x_positions = range(len(df['天气状况'])) # 设置x轴位置
|
||||
plt.bar(x_positions, df['出现次数'], width=bar_width)
|
||||
plt.xlabel('天气状况')
|
||||
plt.ylabel('出现次数')
|
||||
plt.title('天气状况统计')
|
||||
plt.xticks(x_positions, df['天气状况'], rotation=45, ha='right') # 设置x轴标签
|
||||
|
||||
|
||||
def plot_average_temperatures(high_temps, low_temps):
|
||||
avg_high_temps = [sum(high_temps[i:i + 30]) / len(high_temps[i:i + 30]) for i in range(0, len(high_temps), 30)]
|
||||
avg_low_temps = [sum(low_temps[i:i + 30]) / len(low_temps[i:i + 30]) for i in range(0, len(low_temps), 30)]
|
||||
|
||||
plt.rcParams['font.sans-serif'] = ['SimHei']
|
||||
|
||||
months = range(1, 13)
|
||||
plt.plot(months[:len(avg_high_temps)], avg_high_temps, marker='o', label='平均最高气温')
|
||||
plt.plot(months[:len(avg_low_temps)], avg_low_temps, marker='o', label='平均最低气温')
|
||||
|
||||
plt.xlabel('月份')
|
||||
plt.ylabel('平均气温')
|
||||
plt.title('每月平均气温')
|
||||
plt.xticks(months)
|
||||
plt.legend()
|
||||
|
||||
|
||||
# 创建第一个图表,并绘制天气情况柱状图
|
||||
fig1, ax1 = plt.subplots()
|
||||
plot_weather_counts(weather_counts)
|
||||
ax1.set_ylabel('出现次数')
|
||||
ax1.set_title('天气状况统计')
|
||||
|
||||
# 创建第二个图表,并绘制平均气温折线图
|
||||
fig2, ax2 = plt.subplots()
|
||||
plot_average_temperatures(high_temps, low_temps)
|
||||
ax2.set_xlabel('月份')
|
||||
ax2.set_ylabel('平均气温')
|
||||
ax2.set_title('每月平均气温')
|
||||
|
||||
plt.show()
|
Loading…
Reference in new issue