我编译了一个数据帧,其中包含几个不同流计的 USGS 流数据。现在我想创建一个类似于 this 的甘特图。目前,我的数据以列作为站点名称,以日期索引作为行。
这是我的 data 的示例.
我链接的甘特图示例的问题是,我的数据在通常定义水平时间线的开始日期和结束日期之间存在间隙。我发现的许多示例仅考虑了开始日期和结束日期,但没有遗漏中间可能的值。对于某些站点,我如何解释没有数据(值的这些插槽中的空白或 nan)的间隙?
首先,我有一个图显示缺失数据的位置。
import missingno as msno
msno.bar(dfp)
现在,我希望 x 轴上有时间,y 轴上有一条水平线,用于跟踪网站在这些时间包含数据的时间。我知道如何以强力方式执行此操作,这意味着手动挑选有有效数据的开始和结束日期(我在下面编写)。
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dt
df=[('RIO GRANDE AT EMBUDO, NM','2015-7-22','2015-12-7'),
('RIO GRANDE AT EMBUDO, NM','2016-1-22','2016-8-5'),
('RIO GRANDE DEL RANCHO NEAR TALPA, NM','2014-12-10','2015-12-14'),
('RIO GRANDE DEL RANCHO NEAR TALPA, NM','2017-1-10','2017-11-25'),
('RIO GRANDE AT OTOWI BRIDGE, NM','2015-8-17','2017-8-21'),
('RIO GRANDE BLW TAOS JUNCTION BRIDGE NEAR TAOS, NM','2015-9-1','2016-6-1'),
('RIO GRANDE NEAR CERRO, NM','2016-1-2','2016-3-15'),
]
df=pd.DataFrame(data=df)
df.columns = ['A', 'Beg', 'End']
df['Beg'] = pd.to_datetime(df['Beg'])
df['End'] = pd.to_datetime(df['End'])
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111)
ax = ax.xaxis_date()
ax = plt.hlines(df['A'], dt.date2num(df['Beg']), dt.date2num(df['End']))
如何使用我提供的数据框作为示例制作一个图形(如上所示)?理想情况下,我想避免使用暴力方法。
请注意:零值被视为有效数据点。
预先感谢您的反馈!
最佳答案
查找非空数据的日期范围
2020-02-12 编辑以澄清循环中的逻辑
df = pd.read_excel('Downloads/output.xlsx', index_col='date')
确保日期按顺序排列:
df.sort_index(inplace=True)
循环遍历数据并找到良好数据范围的边缘。获取相应的索引值和仪表名称并将它们全部收集在列表中:
# Looping feels like defeat. However, I'm not clever enough to avoid it
good_ranges = []
for i in df:
col = df[i]
gauge_name = col.name
# Start of good data block defined by a number preceeded by a NaN
start_mark = (col.notnull() & col.shift().isnull())
start = col[start_mark].index
# End of good data block defined by a number followed by a Nan
end_mark = (col.notnull() & col.shift(-1).isnull())
end = col[end_mark].index
for s, e in zip(start, end):
good_ranges.append((gauge_name, s, e))
good_ranges = pd.DataFrame(good_ranges, columns=['gauge', 'start', 'end'])
绘图
这里没有什么新鲜事。直接从您的问题中复制:
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111)
ax = ax.xaxis_date()
ax = plt.hlines(good_ranges['gauge'],
dt.date2num(good_ranges['start']),
dt.date2num(good_ranges['end']))
fig.tight_layout()
关于python-3.x - 使用 Python 绘制 USGS 水文数据甘特图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60099737/