尝试将列表中的整数插入到datetime对象中

2 投票
4 回答
932 浏览
提问于 2025-04-15 19:48

我想做的事情很简单:我想从一个范围里创建一个循环,然后把月份插入到日期时间对象中。下面的代码应该很容易理解。我知道 %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 个回答

0

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"。在这两种情况下,+ 的意思不同(一个是整数相加,另一个是字符串拼接),因为它们的类型也不同。

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

这里有几个地方需要你修正一下。

首先,注意你的范围。因为你在用 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 没有定义。

如果你在应用这些修正时遇到任何问题,随时告诉我。记得把你可能遇到的错误信息也一起发过来。

撰写回答