Изменить одинаковые значения в списке словарей - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь извлечь определенные данные, относящиеся к конкретному коду.Мне удалось вытащить данные в новый список словарей, но мне нужно изменить формат даты с «Ymd H: M: S» на «d / m / Y».

data =  [
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.32'},
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.16'},
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.18'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.43'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.33'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.01'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.53'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.22'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.12'},
]

specific_code_data= []
def find_result_with_specific_code(x):
  global specific_code_data
  for d in test_data.ilab_data:
    if d['code'] == x:
        specific_code_data.append(d)
return specific_code_data

Я пыталсяписать что-то вроде:

for d in specific_code_data:
    indate = d['collection_date_time']
    dt_obj = datetime.datetime.strptime(indate, '%Y-%m-%d %H:%M:%S')
    dt_str = datetime.datetime.strftime(dt_obj, '%d/%m/%Y')

Но я не уверен, как изменить значение ключа collection_date_time в моем списке словарей на нужный мне формат.Любая помощь или указание в правильном направлении будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Как насчет этого:

from datetime import datetime

data =  [
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.32'},
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.16'},
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.18'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.43'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.33'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.01'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.53'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.22'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.12'},
]

def alter_datetime_format(entry):
    collection_date_time = datetime.strptime(entry["collection_date_time"], "%Y-%m-%d %H:%M:%S")
    entry["collection_date_time"] = datetime.strftime(collection_date_time, "%d/%m/%Y")
    return entry

def find_result_with_specific_code(x, data):
    return [
        alter_datetime_format(entry)
        for entry in data
        if entry["code"] == x
    ]
0 голосов
/ 15 ноября 2018
'but I need to changed the date format from 'Y-m-d H:M:S' to 'd/m/Y'

я тоже прыгну сюда ... используя pandas

data =  [
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.32'},
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.16'},
    {'collection_date_time': '2018-05-01 00:00:00', 'code': '96423', 'result': '0.18'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.43'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.33'},
    {'collection_date_time': '2017-12-24 13:04:00', 'code': '45674', 'result': '0.01'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.53'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.22'},
    {'collection_date_time': '2018-04-08 09:43:00', 'code': '12343', 'result': '0.12'},
]

sample = pd.DataFrame([d for d in data])

sample['collection_date_time'] = pd.to_datetime(sample['collection_date_time']).dt.normalize()
sample['collection_date_time'] = sample['collection_date_time'].dt.strftime("%d/%m/%Y")

data = []
for value in sample.values:
    list_of_dict = {}
    list_of_dict['code'] = value[0]
    list_of_dict['collection_date_time'] = value[1]
    list_of_dict['result'] = value[2]
    data.append(list_of_dict)

print(data)

[{'code': '96423', 'collection_date_time': '01/05/2018', 'result': '0.32'},
 {'code': '96423', 'collection_date_time': '01/05/2018', 'result': '0.16'},
 {'code': '96423', 'collection_date_time': '01/05/2018', 'result': '0.18'},
 {'code': '45674', 'collection_date_time': '24/12/2017', 'result': '0.43'},
 {'code': '45674', 'collection_date_time': '24/12/2017', 'result': '0.33'},
 {'code': '45674', 'collection_date_time': '24/12/2017', 'result': '0.01'},
 {'code': '12343', 'collection_date_time': '08/04/2018', 'result': '0.53'},
 {'code': '12343', 'collection_date_time': '08/04/2018', 'result': '0.22'},
 {'code': '12343', 'collection_date_time': '08/04/2018', 'result': '0.12'}]
0 голосов
/ 15 ноября 2018

Я думаю, что вы пропустили шаг здесь. Вы не переназначили измененную строку:

for d in specific_code_data:
    indate = d['collection_date_time']
    dt_obj = datetime.datetime.strptime(indate, '%Y-%m-%d %H:%M:%S')
    dt_str = datetime.datetime.strftime(dt_obj, '%d/%m/%Y')
    d['collection_date_time'] = dt_str` # you need to do this

Вы также можете попробовать выполнить преобразование даты с помощью другой функции:

specific_code_data= []
def find_result_with_specific_code(x):
  global specific_code_data
  for d in test_data.ilab_data:
    if d['code'] == x:
        z = change_datetime_str(d) # line I added
        specific_code_data.append(z) # changed d to z
return specific_code_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...