我正在尝试创建一个包含timedelta的字典,它应该转换成天(四舍五入为1d.p.)。你知道吗
输入是一个OrderedDict
和一个值列表。初始化的OrderedDict
和值列表如下所示:
OrderedDict(
[('Jul 2015', defaultdict(<function __main__.<lambda>>, {})),
('Aug 2015', defaultdict(<function __main__.<lambda>>, {})),
('Sep 2015', defaultdict(<function __main__.<lambda>>, {})),
('Oct 2015', defaultdict(<function __main__.<lambda>>, {})),
('Nov 2015', defaultdict(<function __main__.<lambda>>, {})),
('Dec 2015', defaultdict(<function __main__.<lambda>>, {}))]
)
values_list = [
(
datetime.date(2015, 7, 1),
datetime.timedelta(1, 11111),
datetime.timedelta(2, 22222),
datetime.timedelta(3, 33333)
),
(
datetime.date(2015, 8, 1),
datetime.timedelta(4, 44444),
datetime.timedelta(5, 55555),
None
),
...
]
输出应该是这样的:
output_matrix = {
'Jul 2015': {
'time_1': 0.1,
'time_2': 0.3,
'time_3': 0.4
}
'Aug 2015': {
'time_1': 0.5,
'time_2': 0.6,
'time_3': 0
}
...
}
注意,None
时间增量被转换成0
。
这似乎很容易做到,但我到目前为止得到的解决方案真的很难看,我相信有更好的办法。你知道吗
我丑陋的解决方案:
matrix = OrderedDict()
today = timezone.now()
tzinfo = timezone.get_current_timezone()
headers = ['Time 1', 'Time 2', 'Time 3'] # Used elsewhere, could possibly use here?
# Initialise OrderedDict
for i in range(5, -1, -1):
d = datetime(today.year, today.month, 1, tzinfo=tzinfo) - relativedelta(months=i)
matrix[d.strftime("%b %Y")] = defaultdict(lambda: 0)
matrix = build_matrix(matrix, values_list)
def build_matrix(matrix, values_list)
''' Populates a matrix and converts timedeltas into days. '''
for month, time1, time2, time3 in values_list:
month_label = month.strftime("%b %Y")
if time1 is not None:
matrix[month_label]['Time 1'] = round(time1.seconds/60/60/24, 1)
if time2 is not None:
matrix[month_label]['Time 2'] = round(time2.seconds/60/60/24, 1)
if time3 is not None:
matrix[month_label]['Time 3'] = round(time3.seconds/60/60/24, 1)
return matrix
如何改进此解决方案?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐