【问题标题】:How to specify input as datetime?如何将输入指定为日期时间?
【发布时间】:2018-07-30 08:30:39
【问题描述】:

我的项目涉及读取有关城市数据的 CSV 文件,然后计算各种统计数据。我正在尝试创建一个函数,该函数将从 CSV 获取城市数据并创建数据的副本,但应用了日期过滤器。提示用户输入开始和结束日期。

我目前正在测试并尝试使用正确的日期过滤器打印数据。到目前为止,我最大的问题是我似乎无法将用户输入的字符串转换为日期时间格式。有没有办法让用户直接输入日期时间格式的数据?

def date_filtering(city_file):
    date1 = input('Please enter a valid start date that you wish to explore?\n'
    date2 = input('Please enter a valid end date.')    
    print(city_file.loc[date1:date2])

提前致谢!

【问题讨论】:

  • 只有最后两行代码与您的问题相关。请提供最小的工作示例:stackoverflow.com/help/mcve
  • 您需要日期和时间还是只需要日期?
  • @DyZ 该代码示例非常合理。您不需要绝对最小的示例,只要足够短以至于不难理解即可。
  • @SamCraig 这个代码示例合理。不相关的 cmets 的数量和函数定义本身使我无法专注于实际问题。
  • 好的,问题是您甚至可能不需要将字符串转换为日期时间,因为 pandas 足够聪明,可以推断数据类型。但是,这取决于您未提供的数据。

标签: python pandas datetime


【解决方案1】:

我假设您只需要日期,因为您没有在代码中提及时间。您需要做的是以某种方式解析输入以获取年、月和日。我确信它可以使用正则表达式来完成,但只使用 python 内置函数更简单。

在美国表示日期的正常方式是 mm/dd/yyyy,所以我将使用它。

def strtodatetime(str):
     month, day, year = [int(d) for d in str.split("/")]
     return datetime.date(year, month, day)

date1 = strtodatetime(input('Please enter a valid start date that you wish to explore?\n'))
date2 = strtodatetime(input('Please enter a valid end date.'))

strtodatetime 按“/”字符分割输入字符串,然后将结果列表中的每个元素转换为整数。然后它返回一个带有相应日期的新 datetime.date 对象。

如果您担心用户输入了错误格式的内容,您可以使用 try 块来确保他们没有。我可以看到三种可能的异常来源,用户可以输入太多或太少的 /(如 10/2/1999/2),用户可以输入不存在的日期(如 13/32 /-1),或者用户可以输入无法转换为 int 的内容(例如 March/22/1999)。所有三个都会引发 ValueErrors,所以这是我们需要在这里捕获的唯一异常。为了捕捉到这一点,我们将代码更改为

def strtodatetime(str):
     month, day, year = [int(d) for d in str.split("/")]
     return datetime.date(year, month, day)

date_filtering(city_file):
    try:
        date1 = strtodatetime(input('Please enter a valid start date that you wish to explore?\n'))
        date2 = strtodatetime(input('Please enter a valid end date.'))
    except ValueError:
        print('Please enter a valid date in the format mm/dd/yyyy')
        return date_filtering(city_file)
    return city_file.loc[date1:date2]

print(data_filtering(city_file))

【讨论】:

  • 你应该在你的函数中添加一个try 语句或者一个if 语句来测试第三和第六位置是否有'/'。除此之外,还不错
  • @KGSHbteamMineTeamBeastO_ 测试“/”位置会有很多误报/误报,(例如,它会在 2000 年 1 月 1 日引发错误,这是有效的,而不是 13 /33/-001 或 ab/cd/efgh,它们是无效的)。我编辑了我的评论以包括应该做得很好的异常处理。
  • 我已经使用了你的字符串到日期时间函数,但是当我尝试将日期应用到 CSV 文件时仍然出现以下错误,但仍然出现以下错误。 TypeError:“int”和“datetime.date”实例之间不支持“
  • @KevinNgo 这听起来像是其他问题,因为您没有比较上面代码中的任何日期。您编写代码创建与此相关的不同问题并将其链接到此处,我会尽力提供帮助。
  • 1) 你应该使用 MM/DD/YYYY 你应该输入 '02/03/2018'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2021-11-04
  • 1970-01-01
  • 2015-10-14
  • 2015-08-18
相关资源
最近更新 更多