【问题标题】: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

【问题讨论】:

标签: python pandas matplotlib graph gpx


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2021-10-28
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2021-02-17
      • 2023-02-17
      • 2021-09-17
      相关资源
      最近更新 更多