Python

2015-06-10 9 views
5

'da zaman ayarlı çalışma yaparken, sözlükten birden fazla anahtarı değiştirin Anahtarların tamsayı olduğu bir sözlüğe sahibim. Anahtarlardan birini bir tarihte keyfi olarak değiştirdim ve diğer anahtarları değiştirmem gerekiyor.Python

Örnek veri:

{'C-STD-B&M-SUM': {datetime.date(2015, 7, 12): 0, 
       -1: 0.21484699999999998, 
       -2: 0.245074, 
       -3: 0.27874} 

Beklenen çıkış: Bugüne kadar

{'C-STD-B&M-SUM': {datetime.date(2015, 7, 12): 0, 
       datetime.date(2015, 7, 11): 0.21484699999999998, 
       datetime.date(2015, 7, 10): 0.245074, 
       datetime.date(2015, 7, 9): 0.27874} 

Güncel kodu: Sen gibi bir şey deneyebilirsiniz

def change_start_date(dictionary_with_temporal_distribution): 
    unsw_mid_year_end_date = datetime.date(2015, 7, 12) 
    dictionary_with_temporal_distribution['C-STD-B&M-SUM'][unsw_mid_year_end_date] = dictionary_with_temporal_distribution['C-STD-B&M-SUM'][0] 
    del dictionary_with_temporal_distribution['C-STD-B&M-SUM'][0] 
    for k, v in dictionary_with_temporal_distribution['C-STD-B&M-SUM'].items(): 
+0

ihtiyacınız mı - Beklenen çıktıda yanı? -datetime.date() '? –

+0

Hayır, sadece düzenlenmiş! –

cevap

1

-

def change_start_date(dictionary_with_temporal_distribution): 
    unsw_mid_year_end_date = datetime.date(2015, 7, 12) 
    for k in list(dictionary_with_temporal_distribution['C-STD-B&M-SUM'].keys()): 
     dictionary_with_temporal_distribution['C-STD-B&M-SUM'][unsw_mid_year_end_date + timedelta(days=k)] = dictionary_with_temporal_distribution['C-STD-B&M-SUM'][k] 
     del dictionary_with_temporal_distribution['C-STD-B&M-SUM'][k] 
+0

Bunu alıyorum: TypeError: timedelta günleri için desteklenmeyen öğe: datetime.date –

+0

Döngüden önce tüm anahtarların tamsayı olduğundan emin olun. döngü –

+0

önce '0'th elemanını değiştirmeyin, şimdi var: RuntimeError: yineleme sırasında sözlük değiştirildi –

0

Sen dict anlama sözdizimini kullanın ve dönüşümü ve tuşları değiştirebilirsiniz:

dct = {datetime.date(2015, 7, 12): 0, 
    -1: 0.21484699999999998, 
    -2: 0.245074, 
    -3: 0.27874} 

def offset(offset, base): 
    """Applies an offset in days to a base date. 
     If the offset is already a date it is returned as is.""" 
    if type(offset) == datetime.date: 
     return offset 
    return base + datetime.timedelta(offset) 

def offset_keys(dct, base): 
    """Takes a dict and runs offset(key, base) on all keys""" 
    return { offset(k, base): v for k, v in dct.items() } 

pprint(offset_keys(dct, datetime.date(2015, 7, 12))) 
{datetime.date(2015, 7, 9): 0.27874, 
datetime.date(2015, 7, 10): 0.245074, 
datetime.date(2015, 7, 11): 0.21484699999999998, 
datetime.date(2015, 7, 12): 0} 
+0

Bunu elde ediyorum: TypeError: timedelta günleri için desteklenmeyen öğe: str –

+0

Ardından, yönteme doğru sözlüğü aktarmıyorsunuz. "Datetime.date" ve integer'leri olanı bir anahtar olarak, "C-STD-B & M-SUM" ile değil, yalnızca anahtar olarak ilettiğinizden emin olun. – Raniz