获取字典的缺失日期

时间:2019-04-17 08:23:02

标签: python dictionary

我有下一本字典,我需要获取确定期间之间的缺失期,换句话说,获取一个期间的结束日期与下一个开始日期之间的期间。

while

我不确切地知道如何存储丢失的日期。.我猜最好将其存储在另一本词典中。.因此,根据我发布的示例,我需要另一个字典,像这样:

{'0': {'enddate': u'2017/05/25',
       'startdate': u'2017/05/01'},
 '1': {'enddate': u'2017/09/30',
       'startdate': u'2017/06/01'},
 '2': {'enddate': u'2018/03/31',
       'startdate': u'2018/01/01'},
 '3': {'enddate': u'2019/02/28',
       'startdate': u'2018/05/01'}}

获取此字典的函数很简单:

{'0': {'enddate': u'2017/05/26',
       'startdate': u'2017/05/31'},
 '1': {'enddate': u'2017/12/31',
       'startdate': u'2017/10/01'},
 '2': {'enddate': u'2019/03/30',
       'startdate': u'2018/04/01'}'

此函数的输入是另一个函数,它识别目录树中的所有日期。 问题是我不知道该怎么做,我尝试了在这里找到的其他选项,但没有成功...希望获得帮助或指导以开始... 希望我能正确,清楚地解释。

最诚挚的问候。

3 个答案:

答案 0 :(得分:0)

只需一个for循环即可尝试:

from datetime import datetime, timedelta
result = {}

for k,v in d.items():  # d is your input times
    n= str(int(k)+1) 
    if n in d: 
        result[f'{k}-{n}'] = {'start':datetime.strftime(datetime.strptime(d[k]['enddate'], '%Y/%m/%d')+timedelta(days=1),'%Y/%m/%d'), 'end':datetime.strftime(datetime.strptime(d[n]['startdate'], '%Y/%m/%d')-timedelta(days=1),'%Y/%m/%d')} 

结果将是:

{'0-1': {'start': '2017/05/26', 'end': '2017/05/31'},
 '1-2': {'start': '2017/10/01', 'end': '2017/12/31'},
 '2-3': {'start': '2018/04/01', 'end': '2018/04/30'}}

如果您未使用Python3.6或更高版本,请将f'{k}-{n}'更改为'{}-{}'.format(k,n)

答案 1 :(得分:0)

一些粗略的想法:

  1. 使用datetime.strptime
  2. 解析日期
  3. 在字典中,将解析的start_date作为键,并将end_datestart_date之间的差值存储为值(后者是datetime.timedelta对象)
  4. 按顺序列出按键,看是否有空隙。

答案 2 :(得分:0)

尝试

import datetime
import pprint

data = {'0': {'enddate': u'2017/05/25',
              'startdate': u'2017/05/01'},
        '1': {'enddate': u'2017/09/30',
              'startdate': u'2017/06/01'},
        '2': {'enddate': u'2018/03/31',
              'startdate': u'2018/01/01'},
        '3': {'enddate': u'2019/02/28',
              'startdate': u'2018/05/01'}}

start = 1
output = dict()
while True:
    entry_1 = data.get(str(start - 1), None)
    entry_2 = data.get(str(start), None)
    if entry_1 is None or entry_2 is None:
        break
    else:
        start_date = datetime.datetime.strptime(entry_2['startdate'], '%Y/%M/%d')
        end_date = datetime.datetime.strptime(entry_1['enddate'], '%Y/%M/%d')
        output['{}-{}'.format(start, start - 1)] = {'start': str(start_date), 'end': str(end_date),
                                                    'delta': str(end_date - start_date)}
        start += 1
pprint.pprint(output)

输出

{'1-0': {'delta': '23 days, 23:59:00',
         'end': '2017-01-25 00:05:00',
         'start': '2017-01-01 00:06:00'},
 '2-1': {'delta': '-336 days, 0:08:00',
         'end': '2017-01-30 00:09:00',
         'start': '2018-01-01 00:01:00'},
 '3-2': {'delta': '29 days, 23:58:00',
         'end': '2018-01-31 00:03:00',
         'start': '2018-01-01 00:05:00'}}