簡體   English   中英

通過將日期列表與字典中的日期進行比較,在Python中構建值字典

[英]Build a dictionary of values in Python based on comparing a list of dates to dates in a dictionary

我有一個生成的日期列表(最近30天),然后還有從數據庫返回的數據,其中包含日期和這些日期的計數(我將在此描述后發布一些示例數據)。 我想從這兩個字典中構建一個字典,如果不從數據庫返回日期,它將放入一個占位符值。

這是我的日期列表-看起來也像這樣: http : //screencast.com/t/VeB37A3k7KO

temp_dates = [
    datetime.date(2014, 4, 21),
    datetime.date(2014, 4, 22),
    datetime.date(2014, 4, 23),
    datetime.date(2014, 4, 24),
    ....
    datetime.date(2014, 5, 18),
    datetime.date(2014, 5, 19),
    datetime.date(2014, 5, 20),
    datetime.date(2014, 5, 21)
]

從我的數據庫返回的數據是詞典列表。 看起來像這樣:

temp_data = [
    {u'daily_count': 3, u'total_count': 684, u'm_date': datetime.date(2014, 4, 21)},
    {u'daily_count': 2, u'total_count': 686, u'm_date': datetime.date(2014, 4, 22)},
    {u'daily_count': 32, u'total_count': 718, u'm_date': datetime.date(2014, 4, 23)},
    {u'daily_count': 1, u'total_count': 719, u'm_date': datetime.date(2014, 4, 25)},
    {u'daily_count': 1, u'total_count': 720, u'm_date': datetime.date(2014, 4, 26)},
    {u'daily_count': 17, u'total_count': 737, u'm_date': datetime.date(2014, 4, 29)},
    {u'daily_count': 1, u'total_count': 740, u'm_date': datetime.date(2014, 5, 2)},
    {u'daily_count': 1, u'total_count': 741, u'm_date': datetime.date(2014, 5, 4)},
    {u'daily_count': 1, u'total_count': 744, u'm_date': datetime.date(2014, 5, 6)},
    {u'daily_count': 2, u'total_count': 746, u'm_date': datetime.date(2014, 5, 8)}
    ...... etc.
]

我想建立一個字典,將遍歷temp_dates中的日期,如果temp_data中的日期匹配,則將日期作為新的字典鍵,並以total_count作為值。 如果存在不匹配的日期,則輸入先前輸入的值。

這就是我嘗試過的。

sql_info = {}
placeholder = 0

for i in temp_dates:
    for j in temp_data:
        if i == j['m_date']:
            sql_info[i] = j['total_count']
            placeholder = j['total_count']
            break
        else:
            sql_info[i] = placeholder

這行不通。 在第一次通過循環放置第一個值之后,它每次都只放置一個占位符。 684 http://screencast.com/t/BWUfFvYL

我該如何解決這個問題?


我的工作嘗試

    for i in temp_dates:
        dd = i.strftime('%m-%d-%Y')
        sql_info[dd] = {}
        for j in temp_data:
            if i == j['m_date']:
                sql_info[dd]['total_count'] = j['total_count']
                placeholder = j['total_count']
                break
            else:
                if placeholder == 0:
                    placeholder = j['total_count'] - j['daily_count']
                sql_info[dd]['total_count'] = placeholder

如果日期不是第一次,請計算total_count-daily_count以獲取該日期之前存在的計數。 預期的輸出是這樣的: http : //screencast.com/t/0nCGTnAwJq -----如果那里沒有日期,那么我將其添加到字典中並輸入適當的值(每個日期有五個不同的值我輸入)。

不完全確定我是否能得到所需的內容,但這會跟蹤所有占位符,並使用占位符[-2]將總數的倒數第二個值添加到前一個值的后面。

如果您不希望在另一個日期匹配之前更改值,則可以使用計數器來跟蹤並使用占位符[-count]

sql_info = {}
placeholder = []
for i,j in zip(temp_data,temp_dates):
    placeholder.append(i['total_count'])
    if i['m_date'] in temp_dates:
        sql_info[j] = i['total_count']
    else:
        sql_info[j] = placeholder[-2]

這使用strftime來匹配您編輯的答案。

sql_info = {}
placeholder = []
count = 1
for i,j in zip(temp_data,temp_dates):
    dd = j.strftime('%m-%d-%Y')
    placeholder.append(i['total_count'])
    if i['m_date'] in temp_dates:
        sql_info[dd] = i['total_count']
    else:
        count += 1
        sql_info[dd] = placeholder[-count]
print sql_info

發生這種情況是因為您在函數第一次沒有找到i==j['m_date']就調用了“ break”。

在此示例中,由於i和j中的前兩個值彼此匹配,因此它將設置占位符684,然后在其余的循環中將其設置為sql_info[i]

最好的選擇可能是將查詢更改為僅選擇列表中m_date的行。

但是我認為

import bisect
def get_date_count_dict(list_of_dates,dates_count_dict):
    dates_items = sorted(dates_count_dict.items(),key=lambda item:item[0])
    sorted_dates,sorted_counts = zip(*dates_items)
    return dict([(a_date,sorted_counts[bisect.bisect(sorted_dates,a_date)])for a_date in list_of_dates])

new_data = dict([(d['m_date'],d['total_count']) for d in temp_data])
final_data = get_date_count_dict(temp_dates,new_data)

應該管用。

暫無
暫無

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

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