25

我有来自三个不同 GPS 接收器的冰速 GPS 数据。数据位于 pandas 数据框中,索引为 julian day(从 2009 年初开始递增)。

这是数据的一个子集(主要数据集是 3487235 行......):

                    R2          R7         R8
1235.000000 116.321959  100.805197  96.519977
1235.000116 NaN         100.771133  96.234957
1235.000231 NaN         100.584559  97.249262
1235.000347 118.823610  100.169055  96.777833
1235.000463 NaN         99.753551   96.598350
1235.000579 NaN         99.338048   95.283989
1235.000694 113.995003  98.922544   95.154067

数据框具有以下形式:

索引:6071320 个条目,127.67291667 到 1338.51805556
数据列:
R2 3487235 非空值
R7 3875864 非空值
R8 1092430 非空值
数据类型:float64(3)

R2 以与 R7 和 R8 不同的速率采样,因此 NaN 系统地出现在该间距。

尝试df.plot()绘制整个数据框(或其索引行位置)在绘制 R7 和 R8 方面效果很好,但不绘制 R2。同样,只是做df.R2.plot()也行不通。绘制 R2 的唯一方法是做df.R2.dropna().plot(),但这也删除了表示无数据周期的 NaN(而不仅仅是比其他接收器更粗略的采样频率)。

有没有其他人遇到过这个?任何关于该问题的想法将不胜感激:)

4

4 回答 4

23

您看不到任何东西的原因是因为默认的绘图样式只是一条线。但是这条线在 NaN 处被中断,因此只会绘制多个连续的值。而后者不会发生在你的情况下。你需要改变绘图的风格,这取决于你想看到什么。

对于初学者,请尝试添加:

.plot(marker='o')

这应该使所有数据点显示为圆圈。它很容易变得混乱,因此调整标记大小、边缘颜色等可能很有用。我没有完全适应 Pandas 如何使用 matplotlib,所以如果情节变得更复杂,我经常自己切换到 matplotlib,例如:

plt.plot(df.R2.index.to_pydatetime(), df.R2, 'o-')
于 2012-11-28T13:30:27.797 回答
12

鉴于您想在拥有数据的点之间画一条直线,您可以让 Pandas 通过插值填补空白,然后绘制:

.interpolate(method='linear').plot()
于 2020-02-10T11:32:06.337 回答
1

我发现即使 df 被索引为 DateTime 也会发生相同的问题。确保尊重所有数据点且行之间没有间隙的一种解决方案是分别绘制每个 df 列并删除 NaN。

    for col in df.columns:
        plot_data = df[col].dropna()
        ax.plot(plot_data.index.values, plot_data.values, label=col)
于 2019-02-15T15:28:37.623 回答
0

这是另一种方式:

nan_columns = []
nan_values = []

for column in dataset.columns:
    nan_columns.append(column)
    nan_values.append(dataset[column].isnull().sum())

fig, ax = plt.subplots(figsize=(30,10))
plt.bar(nan_columns, nan_values)
于 2019-06-28T14:07:54.567 回答