bbartling
bbartling

Reputation: 3502

look up a value in a dictionary string comparison for date time stamp

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

Answers (3)

Woodford
Woodford

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

alparslan mimaroğlu
alparslan mimaroğlu

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

Barmar
Barmar

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

Related Questions