2015-07-10 31 views
3

我试图选择跨越两个日期时间对象(row['orig_iss_dt']row['maturity_dt'])之间的每个年份的每年1月和7月的任何一天,然后将它插入my_dict。由于我的数据框df中的row['maturity_dt']是从今天(7月)起的6个月的几倍,所以我认为我的代码如下所示。然而,由于我在四月,五月和六月的几个月里得到了一些date,所以它没有按预期工作。我测试了monthdelta函数,它按预期工作。选择两个日期时间对象之间的某些月份

# Number of months between two datetime objects 
def monthdelta(d1, d2): 
    delta = 0 
    while True: 
     mdays = monthrange(d1.year, d1.month)[1] 
     d1 += timedelta(days=mdays) 
     if d1 <= d2: 
      delta += 1 
     else: 
      break 
    return delta 

#Trying to pick out Jan and July between the two datetimes and insert them into the dict 
for (i,row) in df.iterrows(): 
    my_dict = {} 
    date = datetime.datetime.strptime(row['maturity_dt'], '%Y-%m-%d %H:%M:%S.%f') #Setting date to be the maturity date 
    count = 0 
    for k in range(monthdelta(datetime.datetime.strptime(row['orig_iss_dt'], '%Y-%m-%d %H:%M:%S.%f'), datetime.datetime.strptime(row['maturity_dt'], '%Y-%m-%d %H:%M:%S.%f')), 0, -6): 
     #list_of_coupons.append(row.coupon) 
     date -= datetime.timedelta(6*30) #Reducing from the maturity date till it reaches orig_iss_dt 
     print(date) 
     count = count + 1 
     my_dict[count] = date 

谢谢你的解决方案

回答

0

的几点思考:

1) “日期 - = datetime.timedelta(6 * 30)”

我们利用一年时间这条线= 2015年,月= 1天= 30

dt = datetime.datetime(year=2015,month=1,day = 30) 
    for i in range(5): 
      dt -= datetime.timedelta(6*30) 
      print dt 

我们得到:

2014-08-03 00:00:00 
2014-02-04 00:00:00 
2013-08-08 00:00:00 
2013-02-09 00:00:00 
2012-08-13 00:00:00 

这不是七月。

2)我建议你的图书馆 “MonthDelta” http://pythonhosted.org/MonthDelta/ ,可以解决您的问题是这样的:万一

for k in range(monthdelta(datetime.datetime.strptime(row['orig_iss_dt'], '%Y-%m-%d %H:%M:%S.%f'), datetime.datetime.strptime(row['maturity_dt'], '%Y-%m-%d %H:%M:%S.%f')), 0, -6): 
     #list_of_coupons.append(row.coupon) 
     date -= monthdelta.monthdelta(-6) #Reducing from the maturity date till it reaches orig_iss_dt 
     print(date) 
     count = count + 1 
     my_dict[count] = date 

3):

count = count + 1 
my_dict[count] = date 

与此代码,你将永远不会写入my_dict [0]

相关问题