我有一个潮汐高度数据列表,每1分钟读取一次,我已经加载到csv的列表中。
我试图实现的最终结果是能够(线条或条形)图形潮汐并最终得到这样的结果: https://nt.gov.au/__data/assets/pdf_file/0020/430238/2018-mar-tidal-info-ntports-centre-island-graph.pdf
我对编程非常陌生,并为自己设定了一个较小的任务,即从特定日期的高度数据创建潮汐图。然后我会输出多个图表来组成一周等。
# import numpy as np
# from datetime import datetime
DATA:
010120170010 1.700
010120170020 1.650
for line in csv_reader:
data_times.append(datetime.strptime(line[0], "%d%m%Y%H%M"))
data_height.append(float(line[2]))
np_data_times = np.array(data_times)
np_data_height = np.array(data_height)
仅使用今天的高度创建数组 有没有更好的方法来做python相当于SQL '从日期=今天()'中选择* 我可以用时间创建一个字典:高度而不是2个数组吗? (我已经读过,这些词语是无序的,所以不要采用这种方法)
绘图数组每6小时划分 我还希望向图表提供数据点,但仅显示沿X轴每3或6小时划分的时间。这样可以提供更平滑,更准确的图表。到目前为止,我只发现了如何以1:1的方式将数据提供给x轴和它的标签,当我可能需要6:1或18:1等。有没有特定的方法我应该看看?
# import matplotlib.pyplot as plt
plt.title("Tides for today")
plt.xlabel(datetime.date(real_times[0]))
plt.ylabel("Tide Height")
plt.plot(real_times, real_heights)
plt.show()
答案 0 :(得分:0)
不要使用字典。这会使一切变得缓慢而难以处理 我建议考虑使用pandas。
读取数据会像这样:
import pandas as pd
from datetime import datetime
conv={"Time" : lambda t: datetime.strptime(t, "%d%m%Y%H%M")}
df = pd.read_csv("datafile.txt", header=None, delim_whitespace=True,
names=["Time", "Tide"], converters=conv,index_col=0 )
这会产生类似
的内容 Tide
Time
2017-01-01 00:10:00 1.70
2017-01-01 00:20:00 1.65
2017-01-01 05:20:00 1.35
2017-01-02 00:20:00 1.75
您现在可以filter the dataframe,例如仅选择1月1日的数据:
df["2017-01-01":"2017-01-01"]
您可以直接绘制数据,如
df["2017-01-01":"2017-01-01"].plot(kind="bar")
或
df["2017-01-01 00:00":"2017-01-01 06:00"].plot(kind="bar")
如果时间间隔相等,这将很好地工作,因为它会创建一个分类条形图。 (请记住,如果在脚本中工作,则可能需要使用pyplot.show()
)
您也可以使用matplotlib绘制条形
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates
df1 = df["2017-01-01 00:00":"2017-01-01 06:00"]
plt.bar(df1.index,df1.Tide,
width=np.diff(matplotlib.dates.date2num(df1.index.to_pydatetime()))[0], ec="k")
plt.show()
为了控制xaxis滴答和标签,后一种matplotlib解决方案将是最佳选择。首先将条形设置为与边缘align="edge"
对齐。
然后使用格式化程序和定位器,如official dates example所示。可以使用plt.grid
定义网格。
plt.bar(df1.index,df1.Tide,
width=np.diff(matplotlib.dates.date2num(df1.index.to_pydatetime()))[0],
align="edge", ec="k")
hours = matplotlib.dates.HourLocator() # every hour
#hours = matplotlib.dates.HourLocator(byhour=range(24)[::3]) # every 3 hours
fmthours=matplotlib.dates.DateFormatter("%m-%d %H:%M")
plt.gca().xaxis.set_major_locator(hours)
plt.gca().xaxis.set_major_formatter(fmthours)
plt.grid(True, axis="x", linewidth=1, color="k")
plt.gcf().autofmt_xdate()
plt.show()