2017-08-08 83 views
-1

我需要根据以下规则将类型指定给datetime变量。如果datetime属于日期间隔Type1,则类型为Type1。相同的逻辑适用于Type2Type3如何将类型指定给日期时间变量

Type1 
01/01/17 - 07/04/17 
18/04/17 - 25/05/17 
01/10/17 - 22/12/17 

Type2 
08/04/17 - 17/04/17 
26/05/17 - 30/06/17 
27/08/17 - 30/09/17 
23/12/17 - 31/12/17 

Type3 
01/07/17 - 26/08/17 

例如:

from datetime import datetime 
dt = datetime.strptime("2017-04-10 11:00:34.0", "%Y-%m-%d %H:%M:%S.%f") 

dt值应该对应于类型Type2。有什么方法可以在Python 2.7中实现这个任务,而不需要使用大量的if then规则?

+1

坦率地说,我不明白那些“类型” ......请澄清。 – deceze

+0

@deceze:如果'datetime'属于'Type1'的日期间隔,那么类型是'Type1'。 “Type2”和“Type3”也采用了相同的逻辑。 – Dinosaurius

+0

看到了,所以你只是想制定一些条件'如果t1 <= dt <= t2:type = 1 ...',但最好不要做很多'if..elif'? – deceze

回答

1

由于这可怎么构成的草图:

from datetime import datetime, date 

types = { 
    'type1': (
     (date(2017, 1, 1), date(2017, 4, 7)), 
     ... 
    ), 
    ... 
} 

dt = datetime.strptime('2017-04-10 11:00:34.0', '%Y-%m-%d %H:%M:%S.%f') 
the_type = None  

for t, ranges in types.items(): 
    for start, end in ranges: 
     if start <= dt.date() <= end: 
      the_type = t 
      break 

    if the_type is not None: 
     break 
+0

如果我想跳过这一年,是否可以保持相同的方法?换句话说,如果一年并不重要。 – Dinosaurius

+0

然后,您不会存储'日期'对象,但可能只是'(日,月)'元组,并且只需调整比较。 – deceze

+0

我照你的建议做了。比较过程如下:'如果date(dt.year,start(0),start(1))<= dt.date()<= date(dt.year,end(0),end(1)) :',但它给出错误,说开始和结束都是数字。如果我只是从类型中删除'date',他们怎么会是数字,所以他们应该是元组。 – Dinosaurius

相关问题