我想要完成的事情非常简单:从一个范围创建一个循环(下面非常自我解释),它将月份插入到datetime对象中。我知道%d需要一个整数,我知道'月'类型是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
我做错了什么?
所有帮助表示赞赏!谢谢
答案 0 :(得分: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没有定义。
如果您在应用这些修补程序时遇到任何问题,请与我们联系。一定要包括你可能会得到的错误。
答案 1 :(得分: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
答案 2 :(得分: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"
。在那里,+
的含义不同(整数加法与字符串连接),因为类型也不同。
答案 3 :(得分: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)