2010-02-28 62 views
2

我想要完成的事情非常简单:从一个范围创建一个循环(下面相当自我解释),将月份插入到datetime对象中。我知道%d需要一个整数,而且我知道'month'类型是int ...所以我被卡住,为什么我不能替代我的月份变量。这里是我的代码:试图从列表中插入一个整数到日期时间对象中

all_months=range(1,13) 
for month in all_months: 
    month_start = (datetime.date(2010,'%d',1))%month 
    next_month_begin= datetime.date(2010,'%d',1)%(month+1) 
    month_end=next_month_begin - timedelta(days=1) 
    print month_start           
    print month_end 

我在做什么错?

所有帮助表示感谢!谢谢

回答

2

有几件事情需要在这里解决。

编辑:首先,小心你的范围,因为你使用的是月份+ 1来创建next_month_begin,你不希望它大于12或者你会得到一个错误。

接下来,当您尝试创建日期对象时,如果使用(datetime.date(2010,'%d',1))%month,则会将该月作为字符串传递。你的代码可能会抛出这个错误TypeError: an integer is required

你需要给它代表月份的整数,而不是整数的字符串(有1'1'之间的差异)。这也是一个简单的解决方法,因为你已经有一个变量名为month,它已经是一个整数,只是用它来代替制作一个字符串。所以,你的代码应该是这样的:

month_start = datetime.date(2010,month,1)

我认为你可以弄清楚如何将其应用到你的next_month_begin分配。

的最后一个问题是,你需要使用datetime.timedelta来告诉Python的datetime模块中去寻找timedelta()功能 - 您的计划将目前给你一个错误,说是没有定义timedelta。

如果您在应用这些修补程序时遇到任何问题,请告知我。一定要包括你可能得到的错误。

+0

哎呀,我的错误,这是当月+ 1导致的问题,谢谢 – swanson 2010-02-28 01:02:07

+1

不是问题,删除以前的评论 – bernie 2010-02-28 01:04:12

+0

太棒了!除了事实(你注意到)日期时间不接受数字13 ...我试图解决这个问题,一切工作正常与这些修复。我是否需要在12月份包括一个例外情况,指出它只是迭代到31日?或者有更清晰的方法吗? – DalivDali 2010-02-28 01:13:28

0

month是一个变量,您可以使用它来创建日期时间对象。我认为要做到以下几点:

month_start = datetime.date(2010, month, 1) 
next_month_begin = datetime.date(2010, month+1, 1) 

,将工作,因为datetime.date()需要3个整数参数。 '%d' % month会改为将整数month格式化为字符串。例如,'%04d' % 3会将数字3格式化为4位数字和前导零。但重要的是要知道,即使(几乎未格式化)字符串"3"与Python中的3号码不同。

而且你不能写datetime(...) % 3,因为%运算符只能用于格式字符串,如前面的"%03d" % 3示例,而不是在datetime对象上。

但其他类型也可能接受%运算符(不包括日期时间对象)。例如,整数接受%运算符以获得除法余数:3 % 2 # returns 1。但在那里,%的含义完全不同,因为运算符的含义取决于所涉及的类型。例如,请尝试3 + 2"3" + "2"。在那里,+的含义不同(整数加法与字符串连接),因为类型也不同。

+0

谢谢...我肯定会觉得愚蠢! – DalivDali 2010-02-28 00:50:10

2

您还有其他答案,但是有一种方法可以获得本月的最后一天。无论当前月份的天数是多少,增加31天都会使您进入下一个月,然后回到第一天,减去一天会给出结束日期。

import datetime 
for month in range(1,13): 
    month_start = datetime.date(2010,month,1) 
    into_next_month = month_start + datetime.timedelta(days=31) 
    month_end = into_next_month.replace(day=1) - datetime.timedelta(days=1) 
    print month_start,month_end          
0

查看日历模块(http://docs.python.org/library/calendar.html)。

它包括了这样的事情电池...

你可能只是做:

from calendar import Calendar 
def start_and_end_days(year, month): 
    cal = Calendar() 
    month_days = [day for day in cal.itermonthdays(year, month) if day.month == month] 
    first_day = month_days[0] 
    last_day = month_days[-1] 
    return (first_day, last_day) 
相关问题