Python按日期将csv拆分为字典列表列表

时间:2018-03-31 00:43:09

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

我有一个csv文件。我想按当天的旅行分割数据。我尝试创建一个词典列表列表。我希望也许有更好的方法?我的最终目标是使用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 

2 个答案:

答案 0 :(得分:1)

使用itertools.groupby使用日期字符串对行进行分组。 csv.DictReader允许您使用密钥作为csv标头返回csv行作为dicts:

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

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

答案 1 :(得分:0)

我从未使用过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

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