【问题标题】:How can I find the difference in years between two dates using Python? (Work out if a person is over 18)如何使用 Python 找到两个日期之间的年差? (计算一个人是否超过 18 岁)
【发布时间】:2014-10-29 00:33:05
【问题描述】:

我的问题是,是否有人可以帮我调试这段代码:

import datetime
print ("What is your date of birth? ")
dateofbirth = input("Please type your date of birth in a YYYY-MM-DD format ")
year, month, day = map(int, dateofbirth.split('-'))
dateofbirth1 = datetime.date(year, month, day)
today = datetime.date.today()
open('dateutil.tar').read()
from dateutil.relativedelta import relativedelta
difference_in_years = relativedelta(today, dateofbirth1).years
if difference_in_years < 18
print ("Sorry, you are not eligible to vote.")
else
print ("You are over 18 and thus eligible to vote.")

我的目标是尝试编写一段代码,如果有人超过 18 岁并因此有资格投票,则该代码可以计算出来。这意味着通过要求该人输入他们的出生日期,然后计算出他们的出生日期和今天日期之间的年差,然后使用 IF 语句告诉他们是否能够投票(即如果年差大于或小于 18)。

目前我在调试此代码时遇到了几个问题。首先,在第 10 行有一个语法错误,我不确定如何纠正。其次,如果我删除最后 4 行并再次运行代码,我会收到以下错误:

Traceback (most recent call last):
  File "C:\removed\canyouvote.py", line 8, in <module>
    open('dateutil.tar').read()
  File "C:\Program Files (x86)\Python\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 5: character maps to <undefined>

但是很可能还有其他我目前无法解决的错误。可悲的是,由于我对编程很陌生,我的知识和经验并不是很好,所以任何帮助都将不胜感激!在尝试研究解决方案时,我尝试使用我不熟悉的编码,所以请纠正我的错误。

非常感谢您!

【问题讨论】:

  • 好吧,SyntaxError 是因为the syntax is erroneous 而你到底想对文件做什么?您没有将内容分配给任何东西,那条线的意义何在?
  • 在 Python 中,像 ifelse 这样的复合语句在套件之前需要一个冒号,并且套件必须缩进。请参阅教程的First Steps Towards Programming 部分。
  • 另外,你为什么在这里使用dateutil?你有没有试过打印出你从today - dateofbirth1 得到的东西,看看它是否有用? (如果您不习惯在交互式解释器中输入内容、在代码中调用 print 或使用调试器,那么您将需要学习至少一个,最终需要学习全部三个,然后再学习'即使是最琐碎的程序也能成功编写。)

标签: python debugging datetime if-statement syntax-error


【解决方案1】:

您获得UnicodeDecodeError 的原因是您试图打开并读取tarball(即二进制文件),就像它是一个文本文件一样。

当您这样做时,Python 会尝试解释该文件的任意字节,就好像它们代表您的默认字符集 (cp1252) 中的字符一样,但是如果您幸运的话,这会给您一个例外,或者成功地给您如果你不是,那就完全垃圾。尝试在文本编辑器中打开dateutil.tar,看看它作为文本的意义。

很难说如何解决这个问题,因为不清楚您为什么要首先尝试打开和读取该文件。正如jonrsharpe 指出的那样,您没有对结果做任何事情。我无法想象你用它们做什么。

如果您试图使 dateutil 可导入,那么做到这一点的方法不是对脚本中的 tarball 进行任何操作,而是在运行之前从脚本外部安装模块.最简单的方法就是pip install dateutil,它会自动找到dateutil 的正确版本,下载、解压并安装它以供您的所有脚本使用。

话虽如此,这里真的不需要dateutil。如果你只是减去两个datetime 对象,你会得到一个timedelta 对象。


同时,SyntaxError 来自此代码:

if difference_in_years < 18
print ("Sorry, you are not elegible to vote.")
else
print ("You are over 18 and thus elegible to vote.")

在 Python 中,像 ifelse 这样的复合语句在套件之前需要一个冒号,并且套件必须缩进。请参阅本教程的 First Steps Towards Programming 部分。所以:

if difference_in_years < 18:
    print("Sorry, you are not eligible to vote.")
else:
    print("You are over 18 and thus eligible to vote.")

(另请注意,我已删除括号前的空格,以适应 PEP 8 样式,并正确拼写“合格”。)

【讨论】:

  • 抱歉,正如我之前提到的,我几乎没有这方面的经验,您的意见非常有帮助。使用 tarball 的原因很简单,因为我在尝试解决问题时感到困惑,并试图使用我找到的其他相关问题的答案拼凑出一个新代码(显然这不起作用)。我还纠正了拼写错误,这是我的疏忽。谢谢你的回答。
【解决方案2】:

如果没有 dateutils 模块,您可以计算某人可能出生到 18 岁的最晚日期。因此,您甚至不需要解压缩 tarball 或真正担心额外的代码。下面是一个简单的例子,计算一个人必须在 18 岁出生的日期。

import datetime

now = datetime.datetime.today()   # Get a datetime object for today

days = (365 * 18) + (18 / 4)  # calculate days to go back along with leap years
back18 = now - datetime.timedelta(days=days)   # create another datetime object that represents the date the user needs to be to be 18.

然后,当您根据他们的输入创建一个日期时间对象时,您可以对它们进行比较。

if birthdate >= back18:
    do stuff

【讨论】:

  • 谢谢,这真的很有帮助,我现在已经设法解决了。
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 2012-01-06
  • 2021-08-14
  • 2017-06-13
相关资源
最近更新 更多