分析 GPX 数据时出现错误“'NoneType' 对象没有属性 'offset'”

Posted

技术标签:

【中文标题】分析 GPX 数据时出现错误“\'NoneType\' 对象没有属性 \'offset\'”【英文标题】:Error "'NoneType' object has no attribute 'offset'" when analysing GPX data分析 GPX 数据时出现错误“'NoneType' 对象没有属性 'offset'” 【发布时间】:2020-05-20 11:01:54 【问题描述】:

我在学习 Python (https://towardsdatascience.com/how-tracking-apps-analyse-your-gps-data-a-hands-on-tutorial-in-python-756d4db6715d) 时正在学习本教程。

我正处于要绘制“时间”和“海拔”的步骤。但是当我这样做时:

plt.plot(df['time'], df['ele'])
plt.show()

我收到错误消息“'NoneType' 对象没有属性 'offset'”。如果我绘制“经度”和“纬度”,一切正常。 我自己找不到解决这个问题的方法。 到目前为止,这是“我的”代码:

import gpxpy
import matplotlib.pyplot as plt
import datetime
from geopy import distance

from math import sqrt, floor
import numpy as np
import pandas as pd
import chart_studio.plotly as py
import plotly.graph_objects as go
import haversine
#Import Plugins

gpx_file = open('01_Karlsruhe_Schluchsee.gpx', 'r')
gpx = gpxpy.parse(gpx_file)

data = gpx.tracks[0].segments[0].points

## Start Position
start = data[0]
## End Position
finish = data[-1]

df = pd.DataFrame(columns=['lon', 'lat', 'ele', 'time'])

for point in data:
    df = df.append('lon': point.longitude, 'lat' : point.latitude,
                   'ele' : point.elevation, 'time' : point.time, ignore_index=True)

print(df)
plt.plot(df['time'], df['ele'])
plt.show()

Picture of my dataframe

【问题讨论】:

你的数据框是什么样的? 请提供完整的追溯,以便我们为您提供帮助 您好,欢迎来到 ***,请附上Minimal, Reproducible Example。根据您在问题中链接的教程,您的数据框没有名为'ele' 的列。因此,请提供所有必要的信息,以便做出适当的回答。 除非绝对必要,否则请不要将信息共享为图像。我们需要完整的错误消息以及minimal reproducible example。我建议阅读以下文章:ericlippert.com/2014/03/05/how-to-debug-small-programs 【参考方案1】:

问题是gpxpy中的时间有一个SimpleTZ('Z')的时区,我认为是他们自己实现的tzinfo抽象基类。这使它“意识到”而不是“天真”,但显然不允许获得偏移量。

见https://github.com/tkrajina/gpxpy/issues/209。

我按如下方式对其进行了修复,并且还获得了轨道中第一个位置的时区。 (跟踪完成的时区可能与本地时区不同。)

import datetime
from zoneinfo import ZoneInfo
from timezonefinder import TimezoneFinder

def get_data(gpx):
    '''Currently Only does the first track and first segment'''
    tzf = TimezoneFinder()
    # Use lists for the data not a DataFrame
    lat = []
    lon = []
    ele = []
    time = []
    n_trk = len(gpx.tracks)
    for trk in range(n_trk):
        n_seg = len(gpx.tracks[trk].segments)
        first = True  # Flag to get the timezone for this track
        for seg in range(n_seg):
            points = gpx.tracks[trk].segments[seg].points
            for point in points:
                if(first):
                    # Get the time zone from the first point in first segment
                    tz_name = tzf.timezone_at(lng=point.longitude, lat=point.latitude)
                    first = False
                lat.append(point.latitude)
                lon.append(point.longitude)
                ele.append(point.elevation)
                try:
                    new_time = point.time.astimezone(ZoneInfo(tz_name))
                except:
                    new_time = point.time.astimezone(ZoneInfo('UTC'))
                time.append(new_time)
    return lat, lon, ele, time

通过这些更改,PyPlot 中的绘图按预期工作。

ZoneInfo 仅从 Python 3.9 开始可用,在 Windows 上,您还必须安装 tzdata (pip install tzdata) 才能使 ZoneInfo 工作。对于早期版本,您可以使用 pytz 完成基本相同的操作。

【讨论】:

【参考方案2】:

从“时间”列中删除时区可能会奏效。您可以使用tz_localize 执行此操作。请注意,您必须调用方法 dt 才能访问列日期时间属性:

df['time'] = df['time'].dt.tz_localize(None)

【讨论】:

以上是关于分析 GPX 数据时出现错误“'NoneType' 对象没有属性 'offset'”的主要内容,如果未能解决你的问题,请参考以下文章

调用 pymssql.connect 时出现“类型‘NoneType’不可迭代”错误

尝试使用 Python 和 Sqlite3 时出现 NoneType 错误

尝试在 Jupyter Notebook 上使用 Pandas 从现有列创建新列时出现 NoneType 错误

使用 python 模块请求上传 Strava GPX 时出现 ValueError - 为啥?

(Django) 安装夹具“rules.json”时出现问题:“NoneType”对象没有属性“id”

执行多个查询时出现“TypeError: NoneType is not subscriptable”