Change multiple keys from dictionary, while doing timedelta operation in Python

I have a dictionary, which the keys are integers. I arbitrarily changed one of the keys to a date, and I need to change the other keys.

Sample data:

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

Expected output:

{'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}

Current code so far:

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():

Upvotes: 4

Views: 160

Answers (2)

Anand S Kumar
Anand S Kumar

Reputation: 90899

You can try something like -

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]

Upvotes: 1

Raniz
Raniz

Reputation: 11113

You can use dict comprehension syntax and transform and replace the keys:

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}

Upvotes: 0

Related Questions