Reputation: 546
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
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
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