从numpy数组中获取仅与datetime匹配的元素

时间:2017-06-23 09:56:12

标签: python pandas numpy matplotlib

我有一个潮汐高度数据列表,每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()

1 个答案:

答案 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()

这可能看起来像下面这样: enter image description here