如何在Python中使用.writer填充行中的空白/空单元格



我的脚本获取高频数据的实时流。

给定时间戳的每一行数据都有7个可能的参数。

然而,这7个参数可能不会在每个时间戳上都通过。例如:

timestamp 1    2    3    4    5    6    7 
1600      23   12   45   34   44   11   13
1601      23        45        34          
1602      23   12   45   55   34   11   12
1603      23   23   45   34   44   11     
1604                               11   13

数据以JSON字符串的形式到达我手中,我将其解析并刻录为CSV,如下所示:

f = csv.writer(open('file.csv', 'a', newline=''))
f.writerow([
x['data'][0]['timestamp'],
x['data'][0]['param'][0]['1'],
x['data'][0]['param'][0]['2'],
x['data'][0]['param'][0]['3'],
x['data'][0]['param'][0]['4'],
x['data'][0]['param'][0]['5'],
x['data'][0]['param'][0]['6'],
x['data'][0]['param'][0]['7']
])

这将中断,因为给定行中的某些项目将为空。

你有什么建议可以让我按如下方式刻录CSV?

23,12,45,34,44,11,13
23,nan,45,nan,34,nan,nan
23,12,45,55,34,11,12
23,23,45,34,44,11,nan
nan,nan,nan,nan,nan,11,13

EDIT:典型的传入JSON(缺少一些键/值(

{
"data":[
{
"s":"feed",
"timestamp":1607300910205,
"c":"sub",
"param":[
{
"key":"CODE",
"4":9,
"5":11
}
]
}
]
}

您可以使用dict.get将缺失的值替换为'nan'(或您需要的任何默认值(:

f = csv.writer(open('file.csv', 'a', newline=''))
f.writerow([
x['data'][0]['timestamp'],
x['data'][0]['param'][0].get('1', 'nan'),
x['data'][0]['param'][0].get('2', 'nan'),
x['data'][0]['param'][0].get('3', 'nan'),
x['data'][0]['param'][0].get('4', 'nan'),
x['data'][0]['param'][0].get('5', 'nan'),
x['data'][0]['param'][0].get('6', 'nan'),
x['data'][0]['param'][0].get('7', 'nan')
])

如果可以将要显示为nan的值分配给np.nan,则以下解决方案应该有效:

import numpy as np
arr = np.arange(12).reshape(3,4).astype(float)
arr[1, 1] = arr[2, 3] = np.nan
print(arr)
# [[ 0.  1.  2.  3.]
# [ 4. nan  6.  7.]
# [ 8.  9. 10. nan]]
np.savetxt("out.csv", arr, delimiter=",", fmt="%.0f")
# out.csv content:
# 0,1,2,3
# 4,nan,6,7
# 8,9,10,nan

请注意,该示例使用了一个浮点数组,然后以%.0f格式保存CSV文件,以便像整数一样打印数据。这是因为只有浮点数组才能有nan值。因此,请确保将数据转换为浮点数组,如示例所示。

最新更新