Как сравнить строки datetime внутри dict списка с вложенными dicts? - PullRequest
0 голосов
/ 14 мая 2019

Я пишу функцию, которая принимает vendorID и строку date_time, которая должна возвращаться, если vendorID может доставить, если время / дата не перекрываются для выполнения доставки.

Я пытаюсьсравнивать строки datetime внутри dict, который имеет список вложенных dict с различными элементами, включая строку datetime.Я хочу сравнить каждую строку даты и времени из каждого вложенного dict внутри списка и проверить, отличается ли дата, а затем сравнить, прошло ли определенное количество минут.

Попытался перебрать dict и элементы и использовать datetime.strptime () для разбора строки datetime, но я не уверен, как сравнивать даты в списке диктов при итерации по элементам dict.

   dict = {
"results": [
{
    "vendor_id": 1,                    
    "client_id": 10,                   
    "datetime": "2017-01-01 13:30:00"  
},
{
    "vendor_id": 1,
    "client_id": 40,
    "datetime": "2017-01-01 14:30:00"
}

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

Надеюсь, это поможет вам.Использование dict, как вы советовали;

dict = {
    "results": [
    {
        "vendor_id": 1,
        "client_id": 10,
        "datetime": "2017-01-01 13:30:00"
    },
    {
        "vendor_id": 1,
        "client_id": 40,
        "datetime": "2017-01-01 14:30:00"
    }]}

Имея некоторое время даты, используйте цикл for и проверьте if;

somedatetime1 = '2017-01-01 14:00:00'
somedatetime2 = '2017-01-01 15:00:00'

for d in dict['results']:
    if d['datetime'] < somedatetime1:
        print('somedatetime1 :: Vendor {} Client {} DateTime {}'.format(d['vendor_id'], d['client_id'], d['datetime']))
    if d['datetime'] < somedatetime2:
        print('somedatetime2 :: Vendor {} Client {} DateTime {}'.format(d['vendor_id'], d['client_id'], d['datetime']))

Возврат;somedatetime1 :: Vendor 1 Client 10 DateTime 2017-01-01 13:30:00somedatetime2 :: Vendor 1 Client 10 DateTime 2017-01-01 13:30:00somedatetime2 :: Vendor 1 Client 40 DateTime 2017-01-01 14: 30: 00

0 голосов
/ 14 мая 2019

Я думаю, было бы проще сделать это в пандах, так как вы можете группировать ID поставщика и выполнять операции только для этого поставщика.

from sklearn.metrics.pairwise import euclidean_distances
import pandas as pd
import numpy as np

df = pd.DataFrame() #Initiate
grp = df.from_dict(dict['results']).groupby('vendor_id') #Convert into df and groupby vendor id, should be useful when u have more than one vendor
dct = {}

for group in grp.groups:
    df_vid = grp.get_group(group) # Obtain data for that vendor
    df_vid['datetime'] = pd.to_datetime(df_vid['datetime'])
    ab = np.array(df_vid['datetime'])
    dist = euclidean_distances(ab.reshape(-1, 1), ab.reshape(-1, 1)) # Find distance matrix
    dct[group] = dist # Assign it to dict by vendor ID as key
0 голосов
/ 14 мая 2019

Вы можете изменить время типа string на тип datetime. И, просто вы используете -. После этого вы можете использовать timedelta то, что возвращается функцией time_diff, если вы обрабатываете время больше. Если вы хотите получить минуты, используйте атрибут seconds.

from datetime import datetime

def time_diff (a, b):
    return a - b

dict = {
"results": [
{
    "vendor_id": 1,                    
    "client_id": 10,                   
    "datetime": "2017-01-01 13:30:00"  
},
{
    "vendor_id": 1,
    "client_id": 40,
    "datetime": "2017-01-01 14:30:00"
}
]
}


for r in dict['results']:
    r['datetime'] = datetime.strptime(r['datetime'], '%Y-%m-%d %H:%M:%S')

print (int(time_diff(dict['results'][1]['datetime'], dict['results'][0]['datetime']).seconds/60))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...