解析 NYC Transit/MTA 历史 GTFS 数据(非实时)

Parsing NYC Transit/MTA historical GTFS data (not realtime)

几个月来我一直在断断续续地困惑这个问题,找不到解决办法。

MTA 声称在此处提供 GTFS 格式的每日转储形式的历史数据: [http://web.mta.info/developers/MTA-Subway-Time-historical-data.html][1]

通过下载他们提供的示例亲自查看,在本例中为 2014 年 9 月 17 日: [https://datamine-history.s3.amazonaws.com/gtfs-2014-09-17-09-31][1]

我的问题?该文件是 gobbledygook。它不遵循 GTFS 规范,没有扩展名,当我使用文本编辑器打开它时,它看起来像这样的 7800 行:

n ^C1.0^X �枪�^Eʞ>` ^C1.0^R^K ^A1^R^F^P����^E^R^K ^A2^R^F^P����^E^R^K ^A3^R^F^P����^E^R^K ^A4^R^F^P����^E^R^K ^A5^R^F^P����^E^R^K ^A6^R^F^P����^E^R^K ^AS^R^F^P����^E^R[ ^F000001^ZQ 6个 ^N050400_1..S02R^Z^H20140917*^A1�>^V ^P01 0824 242/SFY^P^A^X^C^R^W^R^F^Pɚ��^E"^D140Sʚ>^F ^AA^R^AA^RR ^F000002"H 6

根据 MTA 网站(似乎不真实)

All data is formatted in GTFS-realtime

知道将这个神秘文件转换为可用 GTFS 数据的必要步骤吗?我缺少一些编码吗?我已经找了 10 多个,但无法提出解决方案。

此外,我不是固执己见,但我指的不是 MTA 的实时数据源,它的格式正确且可用。我特别指的是我在上面引用的历史数据转储(已经收到很多 "solutions" 仅指实时数据馈送)

您 link 访问的文件是 GTFS 实时格式,而不是 GTFS,并且您 link 访问的页面在解释其数据实际采用的格式方面做得非常糟糕(虽然在你的引述中提到了它)。

GTFS 用于存储时间表数据,例如路线和预定到达时间。

GTFS-realtime 通常用于实时传输实际的运输性能数据,例如车辆位置和预计或实际到达时间。它是一个 protobuf,一种由 Google 公开的编译二进制数据规范,这意味着您无法在文本编辑器中有效地阅读它,而是必须使用 Google protobuf 工具以编程方式加载它.通过公开提供 GTFS-rt 提要的每日转储,它可以像 MTA 一样用作历史数据格式。之所以称为 GTFS-realtime,是因为 route_idtrip_idstop_id 等实时数据字段旨在 link 发布的 GTFS 计划。

我通过使用 gtfs-realtime.proto 规范和用于 Python 的 Google protobuf 工具反编译它,确认了您 link 编辑的数据的有效性。开始:

header {
  gtfs_realtime_version: "1.0"
  timestamp: 1410960621
}
entity {
  id: "000001"
  trip_update {
    trip {
      trip_id: "050400_1..S02R"
      start_date: "20140917"
      route_id: "1"
    }
    stop_time_update {
      arrival {
        time: 1410960713
      }
      stop_id: "140S"
    }
  }
}
...

并以这种方式继续总共 55833 行(采用默认字符串输出格式)。

编辑:用于将 protobuf 转换为字符串表示的 Python 脚本非常简单:

import gtfs_realtime_pb2 as gtfs_rt

f = open('gtfs-rt.pb', 'rb')
raw_str = f.read()

msg = gtfs_rt.FeedMessage()
msg.ParseFromString(raw_str)

print msg

这需要使用 protoc(按照 "Compiling Your Protocol Buffers" 下的 Python protobuf documentation 中的说明)将 gtfs-realtime.proto 编译成 gtfs_realtime_pb2.py 并放置在与 Python 脚本相同的目录。此外,从 MTA 下载的二进制 protobuf 需要命名为 gtfs-rt.pb 并且位于与 Python 脚本相同的目录中。