我正在尝试实现一个for循环,它可以遍历一个字典。这个字典的值是从csv文件中提取的。某些行的一些值丢失了。我考虑要做的是取前一个和最近可用的下一个条目的平均值,并将其赋给字典。有时连续行都会缺少列值。
以下是一个例子:
input.csv:
Date,Column_1,Column_2,Column_3
2020-06-26,1,3,5
2020-06-27,2,,4
2020-06-28,5,,6
2020-06-29,7,8,10
预期行为是:
输出.csv:
Date,Column_1,Column_2,Column_3
2020-06-26,1,3,5
2020-06-27,2,5.5,4
2020-06-28,5,6.75,6
2020-06-29,7,8,10
(3 + 8) / 2 = 5.5
(5.5 + 8) / 2 = 6.75
这是我尝试的:
def neighborhood(iterable):
iterator = iter(iterable)
previous_item = None
current_item = next(iterator)
for next_item in iterator:
yield previous_item, current_item, next_item
previous_item = current_item
current_item = next_item
yield previous_item, current_item, None
dictionary = {
'2020-06-26': {'Date': '2020-06-26', 'Column_1': 1, 'Column_2': 3, 'Column_3': 5},
'2020-06-27': {'Date': '2020-06-27', 'Column_1': 2, 'Column_3': 4},
'2020-06-28': {'Date': '2020-06-28', 'Column_1': 5, 'Column_3': 6},
'2020-06-29': {'Date': '2020-06-29', 'Column_1': 7, 'Column_2': 8, 'Column_3': 10}
}
field_names = {'Column_1', 'Column_2', 'Column_3'}
for previous_date, current_date, next_date in neighborhood(sorted(dictionary)):
for field_name in field_names:
if field_name not in dictionary[current_date]:
dictionary[current_date][field_name] = (dictionary[previous_date][field_name] + dictionary[next_date][field_name]) / 2
注意:此问题不涉及如何从csv文件读取或写入csv文件。将有一个带有数据的字典,我已经从输入csv文件中提取了它们,并且在此代码片段之后有一些代码将写入输出csv文件。我之所以让字典中的日期出现两次,是因为当我从输入csv文件中读取时,我正在执行以下操作:dictionary[row['Date']] = row
,我可以将其变成列表,但这会使sorted
函数调用复杂化。已知第一行和最后一行保证完全填满,即没有缺少列值。字典键是一个datetime
对象而不是字符串。当我从输入csv文件中读取时,我会将字符串转换为datetime
对象,并将其分配为字典的键。