如何在x-y轴上绘制带日期和时间的等高线图?

时间:2017-08-09 17:19:20

标签: python pandas matplotlib

我有一些看起来像这样的数据:

#date       time        temp    press    rh
09/10/2011 07:50        11.4    798.1   14.1
09/10/2011 08:00        11.9    798.3   13.6
...
09/10/2011 11:30        FALSE   FALSE   FALSE
09/10/2011 11:40        25.4    798.3   11.2
09/10/2011 11:50        23.2    799.1   11.2
.....

我想做一个“temp”的等高线图,x轴为“time”,y轴为“date”。

我尝试使用Pandas来更好地处理日期和NaN值。

data=np.genfromtxt("dataFile.txt", comments="#", dtype='str')

header_names=['date', 'time', 'temp', 'press', 'rh']
df = pd.DataFrame(data, dtype=None, columns=header_names) 
df['date']=pd.to_datetime(df['date'], format='%d/%m/%Y').dt.date   
df.time=pd.to_datetime(df.time, format='%H:%M').dt.time
df.temp = pd.to_numeric(df.temp, errors='coerse')
....

dfMesh=df.pivot('date', 'time', 'temp')
X=dfMesh.columns.values
Y=dfMesh.index.values
Z=dfMesh.values

x,y=np.meshgrid(X, Y)
plt.contourf(x, y, Z)

但是我收到以下错误:

  

追踪(最近一次通话):         文件“./contourPlot_pandas.py”,第33行,in         x,y = np.meshgrid(X,Y)         文件“/Users/marybau/anaconda/lib/python3.6/site-packages/numpy/lib/function_base.py”,   第4533行,在meshgrid中           返回[x * mult_fact for x in output]         文件“/Users/marybau/anaconda/lib/python3.6/site-packages/numpy/lib/function_base.py”,   第4533行           返回[x * mult_fact for x in output]       TypeError:*:'datetime.time'和'int

的不支持的操作数类型

在不使用pandas的情况下,我还尝试了不同的其他方法,但由于date-time格式或NaN,我最终遇到了类似的问题。有什么建议?谢谢!

1 个答案:

答案 0 :(得分:1)

matplotlib contour需要将X和Y值转换为浮点数,基于我在哪里得到错误消息的一点点读数。轮廓绘图很复杂,重新设置日期时间以便与现有函数很好地绘制,这可能比扩展contour更容易。

将日期和时间值转换为正确间隔的数字;例如,日期为Julian日期整数,时间为分钟 - 从午夜开始。从制作虚拟数据开始,然后重新格式化:

import matplotlib.pyplot as plt
import pandas as pd
from math import pi, sin

ts = pd.date_range('1/1/2017 0:00', '1/24/2017 23:00', freq='H') # 24 * 24 long
temp = map(lambda x: sin(2*pi*x/40), range(576))  
# tiny testcase: sin(2*pi*x/12) or /24 provide horizontal contours: quite right.


df = pd.DataFrame({'date':map(lambda x:int(x.to_julian_date()), ts),
                   'time':map(lambda x:x.time().hour*60 + x.time().minute, ts),
                   'temp':temp})

dfMesh = df.pivot('time','date','temp')

fig, ax = plt.subplots()

conts = ax.contour(dfMesh.columns.values, dfMesh.index.values, dfMesh.values)
ax.set_xlabel('Julian day')
ax.set_ylabel('Minutes since midnight')

plt.show()

enter image description here

这样可以将您的数据作为昼夜等高线图进行调查。

为了使绘图标签更易于理解,您可以编辑现有的刻度标签,或更改刻度线的位置,并为新刻度线添加日期或时间字符串标签。但这些是SE上其他地方处理的问题,缺失值的轮廓绘图,插值等等。