【问题标题】:How can I do a contour plot with date and time in the x-y axis?如何在 x-y 轴上绘制日期和时间的等高线图?
【发布时间】:2018-01-17 17:08:19
【问题描述】:

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

#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 轴为“时间”,y 轴为“日期”。

我尝试使用 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)

但我收到以下错误:

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

不支持的操作数类型

'

我也尝试了不同的其他方法来做到这一点而不使用熊猫,但由于date-time 格式或NaN,我最终遇到了类似的问题。有什么建议?谢谢!

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    matplotlib contour 需要将 X 和 Y 值转换为浮点数,基于我收到错误消息的一些读数。等高线绘图非常复杂,重新说明日期时间以使用现有函数进行绘图可能比扩展contour 更容易。

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

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

    这将有助于将您的数据作为昼夜等高线图进行调查。

    为了使绘图标签更易于理解,您可以编辑现有的刻度标签,或更改刻度的放置位置并为新刻度提供日期或时间字符串标签。但这些是 SE 其他地方处理的问题,缺少值的等高线图、插值等也是如此。

    【讨论】:

      猜你喜欢
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多