簡體   English   中英

如何將多個時間戳合並到字典中?

[英]how to merge multiple timestamps into a dictionary?

我已經使用sqlalchemy從sqlite3中提取了表格。 該表包含每次展示汽車的日期和時間:

Id  Car     Code    ShowTime
1   Honda    A      10/18/2017 14:45
1   Honda    A      10/18/2017 17:10
3   Honda    C      10/18/2017 19:35
4   Toyota   B      10/18/2017 12:20
4   Toyota   B      10/18/2017 14:45

所需的輸出是分隔日期並將每個時間戳記放在列表對象上:

"data":{
        'id': '1',
        'schedule': {
            'car': 'Honda',
            'show_date': '10/18/2017',
            'time_available': [
                '14:45',
                '17:10',        
            ],
            'code': 'A'

        }
    },{
        'id': '3',
        'schedule': {
            'car': 'Honda',
            'show_date': '10/18/2017',
            'time_available': [
                '19:35'
            ],
            'code': 'C'
        }
    },{
        'id': '4',
        'schedule': {
            'car': 'Toyota',
            'show_date': '10/18/2017',
            'time_available': [
                '12:20',
                '14:45'
            ],
            'code': 'B'
        }
    }

任何幫助是極大的贊賞!

您可以使用熊貓拆分ShowTime列:

In [22]: import pandas as pd

In [68]: df = pd.read_csv('test.csv')

In [69]: df.rename(columns={'Id':'id','Car':'car', 'Code':'code'}, inplace=True)

In [70]: df[['show_date', 'time_available']] = df.ShowTime.str.split(' ', expand=True)

In [71]: df.drop('ShowTime', axis=1, inplace=True)

In [72]: df
Out[72]:
   id     car code   show_date time_available
0   1   Honda    A  10/18/2017          14:45
1   1   Honda    A  10/18/2017          17:10
2   3   Honda    C  10/18/2017          19:35
3   4  Toyota    B  10/18/2017          12:20
4   4  Toyota    B  10/18/2017          14:45

使用分類值對groupby列進行分組,並將“ time_available”列轉換為分組數據框上的列表:

In [134]: df_grp = df.groupby(['id', 'car','code', 'show_date'])

In [136]: df_grp_time_stacked = df_grp['time_available'].apply(list).reset_index()

In [138]: df_grp_time_stacked
Out[138]:
   id     car code   show_date  time_available
0   1   Honda    A  10/18/2017  [14:45, 17:10]
1   3   Honda    C  10/18/2017         [19:35]
2   4  Toyota    B  10/18/2017  [12:20, 14:45]

In [139]: df_grp_time_stacked['time_available'] = df_grp_time_stacked['time_available'].apply(lambda x:x[0] if (len(x)=
     ...: =1) else x)

In [140]: df_grp_time_stacked
Out[140]:
   id     car code   show_date  time_available
0   1   Honda    A  10/18/2017  [14:45, 17:10]
1   3   Honda    C  10/18/2017           19:35
2   4  Toyota    B  10/18/2017  [12:20, 14:45]

現在將數據框轉換為dict:

In [165]: raw_dict = df_grp_time_stacked.to_dict(orient='records')

In [166]: data = {'data':raw_dict}

In [167]: data
Out[167]:
{'data': [{'id': 1,
   'car': 'Honda',
   'code': 'A',
   'show_date': '10/18/2017',
   'time_available': ['14:45', '17:10']},
  {'id': 3,
   'car': 'Honda',
   'code': 'C',
   'show_date': '10/18/2017',
   'time_available': '19:35'},
  {'id': 4,
   'car': 'Toyota',
   'code': 'B',
   'show_date': '10/18/2017',
   'time_available': ['12:20', '14:45']}]}

您也可以嘗試json庫。 它有點hacky,因為您必須進行一些替換。 由於第一個版本中的錯誤而對其進行了更改。

import json
data = """your string"""
data = data.replace("\n", "").replace("\t", "")
data = data.replace(r"'",r'\"').replace(" ", "").replace(",]", "]").replace('"data":', "").replace("},", r"}},")
outlist = list()
for helper in data.split(r"},"):
    helper = '"'+helper+'"'
    with open(path, 'w') as f:
        f.write(helper)
    with open(path, 'r') as f:
        json_file = json.load(f)
        out_dict = json.loads(json_file)
        outlist.append(out_dict)
print(outlist)

這會產生字典列表:[{'id':'1','schedule':{'car':'Honda','show_date':'10 / 18/2017','time_available':['14: 45','17:10'],'code':'A'}},{'id':'3','schedule':{'car':'Honda','show_date':'10 / 18 / 2017','time_available':['19:35'],'code':'C'}}},{'id':'4','schedule':{'car':'Toyota','show_date ':'10 / 18/2017','time_available':['12:20','14:45'],'code':'B'}}]

干得好:

import pandas as pd
from collections import defaultdict

data = {'Id': [1,1,3,4,4], 'Car': ['Honda','Honda','Honda','Toyota','Toyota'], 'Code': ['A','A','C','B','B'],
        'ShowTime': ['10/18/2017 14:45', '10/18/2017 17:10', '10/18/2017 19:35', '10/18/2017 12:20', '10/18/2017 14:45']}

df = pd.DataFrame(data)

# split time data into 2 columns
df['Date'], df['Time'] = df['ShowTime'].str.split(' ', 1).str

# drop unneeded column
df = df.drop(['ShowTime'],axis=1)

def create_dictionary(i):
    # select data
    selected_data = df.loc[df['Id'] == i]

    # get data
    id = selected_data['Id'].unique()
    car = selected_data['Car'].unique()
    code = selected_data['Code'].unique()
    date = selected_data['Date'].unique()
    time = selected_data['Time'].unique()

    # create dictionary
    dictionary_data = {'id': id[0], 'schedule': {'car': car[0], 'show_date': date[0],
                                                                'time_available': list(time), 'code': code[0]}}
    return dictionary_data

# get id list
id_list = list(df['Id'].unique())

# create data dictionary
out_data = defaultdict(list)

for i in id_list:
    one = create_dictionary(i)
    out_data["data"].append(one)

輸出:

{'data': 
    [
    {'id': 1, 'schedule': {'car': 'Honda', 'show_date': '10/18/2017', 'time_available': ['14:45', '17:10'], 'code': 'A'}},
    {'id': 3, 'schedule': {'car': 'Honda', 'show_date': '10/18/2017', 'time_available': ['19:35'], 'code': 'C'}}, 
    {'id': 4, 'schedule': {'car': 'Toyota', 'show_date': '10/18/2017', 'time_available': ['12:20', '14:45'], 'code': 'B'}}
    ]})

您也可以使用簡單的setdefault()字典方法:

tbl=['1   Honda    A      10/18/2017 14:45',
     '1   Honda    A      10/18/2017 17:10', 
     '3   Honda    C      10/18/2017 19:35', 
     '4   Toyota   B      10/18/2017 12:20', 
     '4   Toyota   B      10/18/2017 14:45']

data={}                                                                                                               

for line in tbl: 

    iden,car,code,show_date,time_available= line.split() 

    data.setdefault( (iden,car,code), {'id':iden,'schedule': {'car':car,'show_date':show_date,'time_available':[],'code':code}})['schedule']['time_available'].append(time_available); 

我們使用(iden,car,code)元組作為字典鍵。 如果字典中存在鍵,則“ setdefault”獲取鍵的值;如果不存在,則創建鍵並將其放入默認值。 我們使用空的“ time_available”列表創建默認結構,並且由於“ setdefault”返回現有或新創建的值,因此我們對該列表進行尋址並將時間值附加到該結構。

data.values()                                                                                                         
dict_values([{'id': '1', 'schedule': {'car': 'Honda', 'show_date': '10/18/2017', 'time_available': ['14:45', '17:10'], 'code': 'A'}}, {'id': '3', 'schedule': {'car': 'Honda', 'show_date': '10/18/2017', 'time_available': ['19:35'], 'code': 'C'}}, {'id': '4', 'schedule': {'car': 'Toyota', 'show_date': '10/18/2017', 'time_available': ['12:20', '14:45'], 'code': 'B'}}])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM