尝试将列表中的整数插入到datetime对象中
我想做的事情很简单:我想从一个范围里创建一个循环,然后把月份插入到日期时间对象中。下面的代码应该很容易理解。我知道 %d 需要一个整数,而 'month' 类型也是整数……所以我有点困惑,为什么我不能用我的月份变量来替换它。以下是我的代码:
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
我哪里做错了?
感谢大家的帮助!谢谢!
4 个回答
month
是一个变量,你可以用它来创建日期时间对象。我想你想做的是下面这样:
month_start = datetime.date(2010, month, 1)
next_month_begin = datetime.date(2010, month+1, 1)
这样做是可以的,因为 datetime.date()
需要三个整数作为参数。'%d' % month
其实是把整数 month
格式化成字符串。例如,'%04d' % 3
会把数字 3 格式化成四位数,前面补零。不过要知道,在 Python 中,几乎没有格式的字符串 "3"
和数字 3
是不一样的。
你不能写 datetime(...) % 3
,因为 %
这个符号只能在格式化字符串上使用,就像之前的 "%03d" % 3
示例那样,而不能用在日期时间对象上。
不过其他类型可能也能使用 %
符号(不包括日期时间对象)。比如,整数可以用 %
符号来获取除法的余数:3 % 2 # 返回 1
。在这里,%
的意思完全不同,因为这个符号的意义取决于参与运算的类型。例如,试试 3 + 2
和 "3" + "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
这里有几个地方需要你修正一下。
首先,注意你的范围。因为你在用 month + 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 没有定义。
如果你在应用这些修正时遇到任何问题,随时告诉我。记得把你可能遇到的错误信息也一起发过来。