【问题标题】:Python split csv by date into list of list of dictionariesPython按日期将csv拆分为字典列表
【发布时间】:2018-03-31 00:43:08
【问题描述】:

我有一个 csv 文件。我想按当天的行程来拆分数据。我尝试创建一个字典列表列表。我希望也许有更好的方法?我的最终目标是使用 get a distance summary from google distance api 来计算当天行驶的距离。

例如,对于以下跟随输入:

输入 csv 文件:

Address,City,State,ShowingDateTime
1234 Hodge Street,Brown,CA,1/4/17 12:00
9613 Llama Street,Downtown,CA,1/5/17 12:15
7836 Bob Street,Swamp,CA,1/5/17 12:15
2134 Cardinal Street,Ruler,CA,1/6/17 11:30

预期的数据结构?:

List[ 
  List[Dict[1234 Hodge Street,Brown,CA,1/4/17 12:00],
  List[
    Dict[9613 Llama Street,Downtown,CA,1/5/17 12:15],
    Dict[7836 Bob Street,Swamp,CA,1/5/17 12:15]
  ],
  List[
    Dict[2134 Cardinal Street,Ruler,CA,1/6/17 11:30]
  ]
]

尝试(不工作):

#!/usr/bin/env python3
from datetime import datetime
from googlemaps import Client
import requests
import csv
def read_csv(csv_file):  
  trip_list = []
  with open(csv_file) as File:
    reader = csv.DictReader(File, dialect='excel')   
    subtrip_list=[]
    previous_date=0
    for row in reader:
      current_date = datetime.strptime(row['ShowingDateTime'], '%m/%d/%y %H:%M').date()
      if previous_date==0:
        previous_date=current_date
      if current_date != previous_date:
        trip_list.append(subtrip_list)
        del subtrip_list[:]
      subtrip_list.append(row)
      previous_date=current_date 

【问题讨论】:

  • 如果您要为对距离矩阵 API 的请求指定 departure_time,则它需要在未来,而不是过去,根据 documentation。因此,您的请求必须省略日期/时间信息。

标签: python list google-maps dictionary data-structures


【解决方案1】:

使用itertools.groupby 使用日期字符串对行进行分组。 csv.DictReader 允许您将 csv 行作为字典返回,并将键作为 csv 标题:

import csv
from itertools import groupby

func = lambda x: x['ShowingDateTime'].split()[0]

def read_csv(csv_file): 
    with open(csv_file) as f:
        reader = csv.DictReader(f)
        lst = [list(grp) for _, grp in groupby(sorted(reader, key=func), func)]
    return lst

这将返回按日期分组的字典列表列表。如果行已经按日期排序,您可以跳过排序步骤。

【讨论】:

    【解决方案2】:

    我从未使用过 google api,但我建议更简单的方法是使用 pandas。

    import pandas as pd
    df = pd.read_csv('data.csv', parse_dates=['DateTime'])
    print(df)
    

    输出

                    Address      City State            DateTime
    0     1234 Hodge Street     Brown    CA 2017-01-04 12:00:00
    1     9613 Llama Street  Downtown    CA 2017-01-05 12:15:00
    2       7836 Bob Street     Swamp    CA 2017-01-05 12:15:00
    3  2134 Cardinal Street     Ruler    CA 2017-01-06 11:30:00
    

    从这一点来看,我认为获得您喜欢的任何格式都容易得多。但是数据框似乎对您的用例非常有用。我会为从最后一点的距离添加另一列,并将来自 google api 的结果插入。但这只是我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2011-05-04
      • 1970-01-01
      相关资源
      最近更新 更多