此解决方案假设来自API的响应已经保存到CSV文件中,格式如第一个截图所示.我用的是csv
模块中的csv.DictReader
和csv.DictWriter
.
在开始之前,我们先使用以下命令导入csv
:
import csv
让我们首先创建一个函数,将DATA_DT
处理成所需的格式
def get_datetime(value: str):
# returns year, month, day, time (hh:mm:ss), in that order
# assumes string length is 14 and has format 'YYYYMMDDhhmmss'
y, m, d = value[0:4], value[4:6], value[6:8]
t = ':'.join([value[8:10], value[10:12], value[12:14]])
return y, m, d, t
一本百人词典:
item_dict = {'1': 'SO2', '3': ...} # please fill this yourself
和CSV DictWriter所需的标头列表:
headers = ['Location', 'Year', 'Month', 'Day', 'Time (24h)', 'Station No.',
'SO2', 'NO2', 'CO', 'O3', 'PM10', 'PM2.5', 'Meter Status']
我们打开CSV文件并将其读入列表raw_data
(请填写文件名).raw_data
的每一个元素都是一个词典:
with open(r'filepath\filename.csv') as file:
raw_data = list(csv.DictReader(file))
我们现在创建一个空的dict data
,然后遍历raw_data
,处理其数据并将其写入dict(在必要的位置添加注释):
data = {}
for rec in raw_data:
loc = rec['LOC_CODE']
if loc not in data:
data[loc] = dict.fromkeys(headers, '')
# rec is from old data, record is for the new data
record = data[loc]
if not record['Year']:
# assumed that date & time for a location is same for all ITEM_CODE
(record['Year'],
record['Month'],
record['Day'],
record['Time (24h)']
) = get_datetime(rec['DATA_DT'])
record['Station No.'] = rec['DATA_STATE']
record['Meter Status'] = rec['DATA_NOVER']
# for the readings we get the apt key using item_dict
record[item_dict[rec['ITEM_CODE']]] = rec['DATA_VALUE']
最后,我们按照csv.DictWriter
期望的方式将data
中的所有记录排列到一个dict
的列表中,并将其写入输出CSV文件(请自己填写文件名):
records = [{**v, 'Location': k} for k, v in data.items()]
with open(r'filepath\newfilename.csv', 'w') as file:
writer = csv.DictWriter(file, fieldnames=headers, lineterminator='\n')
writer.writeheader()
writer.writerows(records)
(您的表中没有值的所有ITEM_CODE
将在创建的CSV中显示一个空单元格)
当然,您必须根据您的需求调整此代码-如果您希望它不删除CSV please中的现有数据,请将模式从'w'
更改为'a'
或'r+'
,并相应地修改代码的数据编写部分.同样,如果您想要按日期或按降序对数据进行排序,请在开始之前执行相同的操作.
我应该将所有代码合并为一个代码,还是留给读者,在下面发表 comments ……;P