将列表中的值映射到已知的字典格式,而不按时间顺序

问题描述

我的值列表如下:

dataPoint1 = ["unnamed","A0001","2009-04-01 00:01","HT","146.5","146.75","FromTestDevice0001","181"]

此列表的格式为

 dataHeader = [Name,ID,DateTime,TypeOfDevice,Reading1,Reading2,Comment,Max Value]

我需要将这些值以以下格式放入字典中; “ id”(字符串),“ name”(字符串),“ year”(整数),“ month”(整数),“ day”(整数),“ hour”(整数),“ reading1”(float),“ reading2”(浮动),“ max”(浮动)。 预期的输出

{"id": "A0001","name": "unnamed","year": 2009,"month": 04,"day": 01,"hour": 00,"reading1": 146.5,"reading2": 146.75,"max": 181}

这些是固定输出(例如dataPoint1),顺序为“ dataHeader”。如何将这些值映射为给定格式的字典?

我当前运行的代码如下。有没有其他方法可以做到这一点? 我们可以在时间上还是在内存方面优化它吗? zip函数不起作用(对我而言),因为dataPoints和映射不正确且归因于类型转换。

def parse_data(dataPoint):
  "This function maps dataPoints to a dictionary"
  data_dictionary = dict()

  if dataPoint[1] != '':
      data_dictionary['id'] = dataPoint[1]

  if dataPoint[0] != '':
      data_dictionary['name'] = dataPoint[0]

  if dataPoint[2] != '':
      data_dictionary['year'] = int(dataPoint[2][:4])
      data_dictionary['month'] = int(dataPoint[2][5:7])
      data_dictionary['day'] = int(dataPoint[2][8:10])
      data_dictionary['hour'] = int(dataPoint[2][11:13])

  if dataPoint[4] != '':
      data_dictionary['reading1'] = float(dataPoint[4])

  if dataPoint[5] != '':
      data_dictionary['reading2'] = float(dataPoint[5])

  if dataPoint[7] != '':
      data_dictionary['max'] = float(dataPoint[7])

  return data_dictionary

解决方法

您可以这样做:

import datetime as dt

dataHeader = ['Name','ID','Year','Month','Day','hour','Reading1','Reading2','MaxValue']
dP1 = ["unnamed","A0001","2009-04-01 00:01","HT","146.5","146.75","From TestDevice0001","181"]
date = dt.datetime.strptime(dP1[2],'%Y-%m-%d %H:%M')
#dP1 = dP1[:2]+[date.year]+[date.month]+[date.day]+[date.hour]+dP1[4:6]+dP1[7:]
dP1 = dP1[:2]+[int(date.year)]+[int(date.month)]+[int(date.day)]+[int(date.hour)]+[float(dP1[4])]+[float(dP1[5])]+[float(dP1[7])]
datadictionary = dict(zip(dataHeader,dP1))
,

你可以那样做

data_dictionary=dict(zip(dataHeader,dataPoint1))

结果将是这样:

{'Comment': 'FromTestDevice0001','TypeOfDevice': 'HT','Name': 'unnamed','Reading1': '146.5','Reading2': '146.75','DateTime': '2009-04-01 00:01','Max Value': '181','ID': 'A0001'}

这并不完全符合您的要求,但是您可以通过编辑dataHeader,dataPoint1,分别给出日期/时间/年,来实现这一目标

或者您可以那样做

dataPoint1[2]=[int(dataPoint1[2][:4]),int(dataPoint1[2][5:7]),int(dataPoint1[2][8:10]),int(dataPoint1[2][11:13])]

结果将是这样:

{'Comment': 'FromTestDevice0001','DateTime': [2009,4,1,0],'ID': 'A0001'}