python_根據規土委乘客刷卡數據_找出用戶的上車、下車站點經緯度

import os
import threading
from datetime import datetime

import pandas as pd

from src.relate_data import get_bus_geo_polyline
from utils.read_write import  writeOneCSV

'''
    此文件用於找出用戶的上車下車站點經緯度
'''

def get_terminal():
    guituwei = 'D:\data\403.csv'
    terminal = pd.read_csv(guituwei)
    return terminal


def terminal_line_license():
    terminal_line_license = 'merge_all.csv'
    line_license_data = pd.read_csv(terminal_line_license)
    return line_license_data



# 按照乘客刷卡對應的POS卡號,找到相對應的車輛車牌,
def find_plate(terminal_id):
    plate_ser = relate_terminal[relate_terminal['終端編號']==terminal_id]
    if not plate_ser.empty:
        plate = str(plate_ser.iat[0,4])
        return plate
    return ''

# 根據用戶的刷卡時間找到離公交車軌跡定位時間最近的時間,從而對應用戶上車的座標
# 根據用戶上車的座標找到離用戶最近的公交車站點座標,近似推算用戶上車的站點
# ['line', 'license', 'time', 'longitude','latitude','speed','other']
def compare_time_find_station(card_terminal, plate_geo):
    up_station_list = []
    card_car_date_time = datetime.strptime(card_terminal[2], "%Y-%m-%d %H:%M:%S")
    time_list = plate_geo['time']
    time_list  = time_list.sort_values()
    time_list_copy = time_list.tolist()
    geo_time = str_search(time_list_copy,card_car_date_time)
    if geo_time:
        one_plate_geo = plate_geo[plate_geo['time'] == geo_time]
        up_station_list.append(card_terminal[0])
        up_station_list.append(card_terminal[3])
        up_station_list.append(card_terminal[2])
        up_station_list.append(one_plate_geo.iat[0,1])
        up_station_list.append(one_plate_geo.iat[0,3])
        up_station_list.append(one_plate_geo.iat[0,4])
    return up_station_list


def str_search(li,card_car_date_time):
    start = 0
    end = len(li) - 1
    # 只要start和end 還沒錯開 就一直找
    while start <= end:
        # 通過計算獲取當前查找範圍的中間位置
        mid = (start + end) // 2
        geo_date_time = li[mid]
        geo_time = datetime.strptime(geo_date_time, "%Y-%m-%dT%H:%M:%S.%fZ")
        if end - start < 2:
            return geo_date_time
        # 如果mid比item大,說明item可能會出現在mid左邊,對左邊再查找
        elif geo_time > card_car_date_time:
            end = mid - 1
        # mid 比item小,說明item有可能在mid右邊,對右邊再查找
        else:
            start = mid + 1

# 根據車牌可以找到公交車線路定位軌跡
# 前提是車是否在指定路線的軌跡上跑,如果符合則可實現乘客的刷卡數據和公交車線路定位軌跡數據的關聯
def find_plate_geo(plate):
    plate_file_path = src + plate + '.csv'
    if os.path.exists(plate_file_path):
        bus_geo = get_bus_geo_polyline(plate_file_path)
        return bus_geo
    return pd.DataFrame(columns=['k'])


def loop():
    for x in range(0, 17638533):
        card_terminal = terminal_record.loc[x]
        card_terminal_plate = find_plate(card_terminal[3])
        # 根據車牌找到公交車線路定位軌跡
        plate_geo = find_plate_geo(card_terminal_plate)
        # 根據用戶的刷卡時間找到最近的公交車定位時間,從而對應用戶的上車座標
        if not plate_geo.empty:
            up_station = compare_time_find_station(card_terminal, plate_geo)
            if up_station:
                writeOneCSV(up_station, 'bus_o.csv')



if __name__ == "__main__":
    # 設備線路終端編號對照表  終端編號	公司名稱	線路或站點	車牌
    relate_terminal = terminal_line_license()
    src = 'D3\\'

    # 規土委乘客刷卡數據    CARDID	TRADETYPE	TRADEDATE	TERMINALID(終端編號)
    terminal_record = get_terminal()
    loop()

如有如何問題或需要幫助,請私聊我!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章