简体   繁体   English

在日期时间戳的字典字符串比较中查找值

[英]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:如果我有这样的数据,其中时间块以 15 分钟为间隔:

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?我如何根据作为字符串的时间戳值查找有效负载值(称为charmany )? 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 :我想检索这个1的 int 值:

     {'Time Block': '2021-08-19 07:45:00', 'charmany': 1}, <----
     {'Time Block': '2021-08-19 08:00:00', 'charmany': 1},

As the string value representing Time Block for find_this_payload is less than 08:00:00 but greater than 07:45:00由于表示find_this_payloadTime Block的字符串值小于08:00:00但大于07:45:00

trying to loop through the dictionary values inside the list dict_df :尝试遍历列表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.我可以打印时间块字符串和有效负载值,但可以使用有关实际合并查找 function 的提示。非常感谢任何帮助。

Since you want to search for values in between your key values, you're really looking for something like bisect.bisect_left .因为您想搜索键值之间的值,所以您实际上是在寻找类似bisect.bisect_left的东西。 Unfortunately bisect_left doesn't support custom compare functions so you'll have to write your own binary search.不幸的是bisect_left不支持自定义比较函数,因此您必须编写自己的二进制搜索。 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.如果您要多次搜索同一个列表,可能值得重组您的数据以将datetime时间表示直接包含在列表中,这样您就不必在每次搜索时都解析相同的字符串。

Just compare the Time Block element with what you're searching for.只需将Time Block元素与您要搜索的内容进行比较即可。

for val in dict_df:
    if val['Time Block'] == find_this_payload:
        print(val['charmony'])
        break # remove this if there can be multiple matches

If you can use pandas and datetime you can use如果你可以使用 pandas 和 datetime 你可以使用

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']

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM