Reputation: 3502
If I have data like this where the time block is on 15 minute intervals:
dict_df = [{'Time Block': '2021-08-19 00:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 00:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 00:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 00:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 01:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 01:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 01:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 01:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 02:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 02:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 02:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 02:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 03:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 03:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 03:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 03:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 04:00:00', 'charmany': 1},
{'Time Block': '2021-08-19 04:15:00', 'charmany': 1},
{'Time Block': '2021-08-19 04:30:00', 'charmany': 1},
{'Time Block': '2021-08-19 04:45:00', 'charmany': 1},
{'Time Block': '2021-08-19 05:00:00', 'charmany': 1},
{'Time Block': '2021-08-19 05:15:00', 'charmany': 1},
{'Time Block': '2021-08-19 05:30:00', 'charmany': 1},
{'Time Block': '2021-08-19 05:45:00', 'charmany': 1},
{'Time Block': '2021-08-19 06:00:00', 'charmany': 1},
{'Time Block': '2021-08-19 06:15:00', 'charmany': 1},
{'Time Block': '2021-08-19 06:30:00', 'charmany': 1},
{'Time Block': '2021-08-19 06:45:00', 'charmany': 1},
{'Time Block': '2021-08-19 07:00:00', 'charmany': 1},
{'Time Block': '2021-08-19 07:15:00', 'charmany': 1},
{'Time Block': '2021-08-19 07:30:00', 'charmany': 1},
{'Time Block': '2021-08-19 07:45:00', 'charmany': 1},
{'Time Block': '2021-08-19 08:00:00', 'charmany': 1},
{'Time Block': '2021-08-19 08:15:00', 'charmany': 1},
{'Time Block': '2021-08-19 08:30:00', 'charmany': 1},
{'Time Block': '2021-08-19 08:45:00', 'charmany': 1},
{'Time Block': '2021-08-19 09:00:00', 'charmany': 1},
{'Time Block': '2021-08-19 09:15:00', 'charmany': 1},
{'Time Block': '2021-08-19 09:30:00', 'charmany': 1},
{'Time Block': '2021-08-19 09:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 10:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 10:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 10:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 10:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 11:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 11:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 11:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 11:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 12:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 12:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 12:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 12:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 13:00:00', 'charmany': 2},
{'Time Block': '2021-08-19 13:15:00', 'charmany': 2},
{'Time Block': '2021-08-19 13:30:00', 'charmany': 2},
{'Time Block': '2021-08-19 13:45:00', 'charmany': 2},
{'Time Block': '2021-08-19 14:00:00', 'charmany': 2},
{'Time Block': '2021-08-19 14:15:00', 'charmany': 2},
{'Time Block': '2021-08-19 14:30:00', 'charmany': 2},
{'Time Block': '2021-08-19 14:45:00', 'charmany': 2},
{'Time Block': '2021-08-19 15:00:00', 'charmany': 2},
{'Time Block': '2021-08-19 15:15:00', 'charmany': 2},
{'Time Block': '2021-08-19 15:30:00', 'charmany': 2},
{'Time Block': '2021-08-19 15:45:00', 'charmany': 2},
{'Time Block': '2021-08-19 16:00:00', 'charmany': 2},
{'Time Block': '2021-08-19 16:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 16:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 16:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 17:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 17:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 17:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 17:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 18:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 18:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 18:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 18:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 19:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 19:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 19:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 19:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 20:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 20:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 20:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 20:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 21:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 21:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 21:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 21:45:00', 'charmany': 0},
{'Time Block': '2021-08-19 22:00:00', 'charmany': 0},
{'Time Block': '2021-08-19 22:15:00', 'charmany': 0},
{'Time Block': '2021-08-19 22:30:00', 'charmany': 0},
{'Time Block': '2021-08-19 22:45:01', 'charmany': 0},
{'Time Block': '2021-08-19 23:00:01', 'charmany': 0},
{'Time Block': '2021-08-19 23:15:01', 'charmany': 0},
{'Time Block': '2021-08-19 23:30:01', 'charmany': 0},
{'Time Block': '2021-08-19 23:45:01', 'charmany': 0}]
How would I lookup a payload value (called charmany
) based on a time stamp value that is a string? For example how would I find this payload based on the time block string?
find_this_payload = '2021-08-19 07:49:00'
I would want to retrieve this int value of 1
:
{'Time Block': '2021-08-19 07:45:00', 'charmany': 1}, <----
{'Time Block': '2021-08-19 08:00:00', 'charmany': 1},
As the string value representingTime Block
for find_this_payload
is less than 08:00:00
but greater than 07:45:00
trying to loop through the dictionary values inside the list dict_df
:
for val in dict_df:
for block,payload in val.items():
print(payload)
I can print the time block strings and payload values but could use a tip on actually incorporating a look up function. Any help greatly appreciated.
Upvotes: 0
Views: 66
Reputation: 4449
Since you want to search for values in between your key values, you're really looking for something like bisect.bisect_left
. Unfortunately bisect_left
doesn't support custom compare functions so you'll have to write your own binary search. Fortunately that's not too difficult.
import datetime
def find_charmanv(dict_df, timestamp):
target_val = datetime.datetime.fromisoformat(timestamp)
lo, hi = 0, len(dict_df)
while lo < hi:
mid = (lo + hi) // 2
mid_val = datetime.datetime.fromisoformat(dict_df[mid]['Time Block'])
if mid_val < target_val:
lo = mid + 1
elif mid_val > target_val:
hi = mid
else:
break
return dict_df[mid]['charmany']
>>> find_charmanv(dict_df, '2021-08-19 09:30:10')
1
If you're going to search the same list many times, it would probably be worth restructuring your data to include the datetime
representation directly in the list so you don't have to parse the same strings every time you search.
Upvotes: 1
Reputation: 1490
If you can use pandas and datetime you can use
from datetime import datetime
import pandas as pd
#dict_df code#
find_this_payload = datetime.fromisoformat('2021-08-19 07:49:00')
dict_df = pd.DataFrame(dict_df)
dict_df['Time Block'] = pd.to_datetime(dict_df['Time Block'])
dict_df.loc[lambda x: x['Time Block']<find_this_payload].tail(1)['charmany']
Upvotes: 0
Reputation: 781096
Just compare the Time Block
element with what you're searching for.
for val in dict_df:
if val['Time Block'] == find_this_payload:
print(val['charmony'])
break # remove this if there can be multiple matches
Upvotes: 0