分析 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 - 为啥?