Jua*_*eto 4 python datetime pandas seaborn
我正在创建从 1870 年开始的每N年洪水事件的分布图。我使用的是 Pandas 和 Seaborn。我需要帮助...
sns.displot
,以及为了澄清这个问题,这里是我正在使用的数据、我尝试过的数据以及所需输出的描述。
我使用的数据可从美国天气服务获得。
import pandas as pd
import bs4
import urllib.request
link = "https://water.weather.gov/ahps2/crests.php?wfo=jan&gage=jacm6&crest_type=historic"
webpage=str(urllib.request.urlopen(link).read())
soup = bs4.BeautifulSoup(webpage)
tbl = soup.find('div', class_='water_information')
vals = tbl.get_text().split(r'\n')
tcdf = pd.Series(vals).str.extractall(r'\((?P<Rank>\d+)\)\s(?P<Stage>\d+.\d+)\sft\son\s(?P<Date>\d{2}\/\d{2}\/\d{4})')\
.reset_index(drop=True)
tcdf['Stage'] = tcdf.Stage.astype(float)
total_crests_events = len(tcdf)
tcdf['Rank'] = tcdf.Rank.astype(int)
tcdf['Date'] = pd.to_datetime(tcdf.Date)
Run Code Online (Sandbox Code Playgroud)
我可以使用 Seaborn 绘制数据displot
,并且可以使用命令操纵垃圾箱的数量bins
。
第二张图片更接近我想要的输出。然而,我认为垃圾箱的起点和终点并不清楚。例如,前两个 bin(从左到右阅读)清楚地开始于 1880 年之前并结束于 1880 年之后,但确切的年份不清楚。
import seaborn as sns
# fig. 1: data distribution using default bin parameters
sns.displot(data=tcdf,x="Date")
# fig. 2: data distribution using 40 bins
sns.displot(data=tcdf,x="Date",bins=40)
Run Code Online (Sandbox Code Playgroud)
我尝试使用输入指定日期范围bins
。该方法大致基于之前的 SO 线程。
my_bins = pd.date_range(start='1870',end='2025',freq='5YS')
sns.displot(data=tcdf,x="Date",bins=my_bins)
Run Code Online (Sandbox Code Playgroud)
然而,这种尝试产生了 TypeError
TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
Run Code Online (Sandbox Code Playgroud)
这是一个很长的问题,所以我想可能有必要进行一些澄清。请随时在评论中提出问题。
提前致谢。
Seaborn 在内部将其输入数据转换为数字,以便可以对它们进行数学运算,并使用 matplotlib 的“单位转换”机制来完成此操作。因此,传递有效的 bin 的最简单方法是使用 matplotlib 的日期转换器:
sns.displot(data=tcdf, x="Date", bins=mpl.dates.date2num(my_bins))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1343 次 |
最近记录: |