【问题标题】:Merge two dictionaries on date keys在日期键上合并两个字典
【发布时间】:2015-11-02 20:17:23
【问题描述】:

假设您有两个(有序)字典,它们从(字符串)日期映射到十进制数,如下所示:

adata = OrderedDict(
    [('2014-01-06', Decimal('14560.810')), 
     ('2014-01-13', Decimal('17867.040')), 
     ('2013-12-30', Decimal('8941.440')), 
     ('2014-02-10', Decimal('17737.630')), 
     ('2014-02-03', Decimal('14450.870')), 
     ('2014-01-20', Decimal('15595.400')),
     ('2014-02-24', Decimal('6290.760')), 
     ('2014-01-27', Decimal('14619.390'))]) 

bdata=  OrderedDict(
    [('2013-01-27', Decimal('12173.170')), 
     ('2012-12-31', Decimal('14447.010')),  
     ('2014-02-24', Decimal('14861.870')),  
     ('2014-02-27', Decimal('861.870'))])

如何根据以下规则将adatabdata 合并:

  1. 按月和日合并,而不是按年合并。
  2. 如果adata 中的键存在于bdata 中,则将bdata[key] 的值分配到第二个位置,否则将值分配到那里。
  3. 返回这个,但按日期排序。
  4. Decimals 可以替换为浮点数。

我希望这个输出:

cdata =  OrderedDict(
    [('2013-12-30', (Decimal('8941.440'), 0)),
     ('2012-12-31', (0, Decimal('14447.010'))),          
     ('2014-01-06', (Decimal('14560.810'), 0)),
     ('2014-01-13', (Decimal('17867.040'), 0)), 
     ('2014-01-20', (Decimal('15595.400'), 0)),
     ('2014-01-27', (Decimal('14619.390'), Decimal('12173.170'))), 
     ('2014-02-03', (Decimal('14450.870'), 0)), 
     ('2014-02-10', (Decimal('17737.630'), 0)), 
     ('2014-02-24', (Decimal('6290.760'), Decimal('14861.870'))),
     ('2014-02-27', (0, Decimal('861.870'))) ])

我尝试了以下操作,但没有得到我想要的输出。

cdata = OrderedDict()
for key in adata.keys() + bdata.keys():
if not cdata.has_key(key):
    try:
        val_b = adata[key]
    except KeyError:
        val_b = 0
    try:
        val_c = bdata[key]
    except KeyError:
        val_c = 0
    cdata[key] = (val_b, val_c)

【问题讨论】:

  • 你得到了什么输出?
  • 因为我得到这个 {'2014-01-06': (Decimal('14560.810'), 0), '2014-01-13': (Decimal('17867.040'), 0), '2013-12-30': (Decimal('8941.440'), 0), '2014-02-10': (Decimal('17737.630'), 0), '2014-02-03': (Decimal('14450.870'), 0), '2014-01-20': (Decimal('15595.400'), 0), '2014-02-24': (Decimal('6290.760'), Decimal('14861.870')), '2014-01-27': (Decimal('14619.390'), 0), '2013-01-27': (0, Decimal('12173.170')), '2012-12-31': (0, Decimal('14447.010')), '2014-02-27': (0, Decimal('861.870'))} 似乎是正确的(未排序),接受您从输出中排除了您的一个输入。
  • 是的,这可能是我忘记了,但它应该按关键日期排序。你能在这里分享你的代码吗?我会检查并告诉你。在 cdata 中查看我的编辑

标签: python date merge ordereddictionary


【解决方案1】:

尝试在末尾添加:

cdata = OrderedDict([(key, cdata[key]) for key in sorted(cdata)])

它将按日期字符串对合并的字典进行排序。

【讨论】:

  • 如何合并那些字典?
  • 据我所知,您的合并代码运行良好。我测试了它。输出只是没有排序
【解决方案2】:

要使其仅按月和日正确排序,您需要一个自定义比较器:

month_day = lambda x: tuple(map(int,x[-5:].split('-')))

def month_day_cmp(a,b):
    a = month_day(a)
    b = month_day(b)
    def cmp(a,b,index):
        if index > 1: return 0
        if a[index] > b[index]:
            return 1
        elif a[index] < b[index]:
            return -1
        else:
            return cmp(a,b,index+1)
    return cmp(a, b, 0)


for k,v in OrderedDict(sorted(cdata.items(),cmp=month_day_cmp, key=lambda x: x[0])).items():
    print '{} -> {}'.format(k,v)

cdata 键是如何定义的问题并不完全清楚。 例如,如果您有两个具有相同月份和日期但年份不同的日期 - 我们在键中使用哪一年?如果这很重要,您将需要更多代码。

【讨论】:

    猜你喜欢
    • 2022-12-12
    • 2021-12-28
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多