【问题标题】:How to parse time string without date and date string without time?如何解析没有日期的时间字符串和没有时间的日期字符串?
【发布时间】:2019-01-08 09:45:29
【问题描述】:

有没有办法自动将字符串解析为datetime.time 对象(或类似的东西)? datetime.date 也一样。

我试过dateutilarrowmomentpandas.to_datetime。 所有这些解析器都会创建带有当前日期的时间戳。

>>> from dateutil.parser import parse
>>> parse('23:53')
datetime.datetime(2019, 1, 8, 23, 53)  # datetime.time(23, 53) expected
>>> parse('2018-01-04')
datetime.datetime(2018, 1, 4, 0, 0)  # datetime.date(2018, 1, 4) expected

UPD:

感谢您的回复。认为我应该澄清这个问题。

程序不知道输入中的内容(timestampdatetime),它应该决定设置适当的类型。问题在于区分这些类型。

例如,我可以解析23:53 并获取时间戳。我如何决定是否从中提取时间?

【问题讨论】:

    标签: python date datetime time


    【解决方案1】:

    您基本上想要的是让“23:53”成为datetime.time 对象,让“2018-01-04”成为datetime.date 对象。这不能通过使用dateutil.parser.parse()来实现:

    返回一个datetime.datetime 对象,或者,如果fuzzy_with_tokens 选项是True,则返回一个元组,第一个元素是datetime.datetime 对象,第二个元素是包含模糊标记的元组。

    来自documentation。所以你在使用dateutil.parser.parse()时总是会得到一个 datetime.datetime 对象

    我猜你需要自己解释输入字符串来定义你是尝试解析时间还是日期。当你这样做时,你仍然可以使用dateutil.parser.parse() 函数来获取你想要的对象:

    from dateutil.parser import parse
    my_time = parse('23:53')
    my_time.time()  # datetime.time(23, 53)
    my_time.date()  # datetime.date(2019, 1, 8)
    

    【讨论】:

      【解决方案2】:

      您可以从datetime 使用fromisoformat()

      import datetime
      datetime.time.fromisoformat('23:53')
      datetime.date.fromisoformat('2018-01-04')
      

      【讨论】:

      • 可能值得一提的是,fromisoformat() 直到 Python 3.7 才被添加。
      【解决方案3】:

      这里有一个例子。只需用 replace 设置日期属性,然后用 strftime 选择输出。

      import datetime
      date = datetime.datetime.now()
      newdate = date.replace(hour=11, minute=59)
      print(newdate.strftime('%H:%M'))
      newdate2 = date.replace(year=2014, month=1, day=3)
      print(newdate2.strftime('%Y-%m-%d'))
      

      【讨论】:

        【解决方案4】:

        您可以使用 time 或 datetime 模块,但要记住一件事,它们总是创建一个对象,指定时间的某个时刻。 (另外,如果解析字符串,可以考虑使用strptime函数,分别显示为字符串、strftime函数)

        例如

        >>> hours = time.strptime("23:59", "%H:%M")
        >>> days = time.strptime("2018-01-04", "%Y-%m-%d")
        >>> time.strftime("%H:%M", hours)
        '23:59'
        >>> time.strftime("%H:%M %Y", hours)
        '23:59 1900'
        

        不推荐,但如果您出于某种原因希望将这两个对象分开并希望只关注分配的特定部分,您仍然可以使用相应的数字来寻址

        >>> hours.tm_hour
        23
        >>> hours.tm_min
        59
        
        >>> days.tm_mon
        1
        >>> days.tm_mday
        4
        >>> days.tm_year
        2018
        

        在我看来,更好的方法是格式化完整的日期字符串并使用 strptime 形成完整的时间戳 - 即使您将时间和日期作为单独的输入:

        >>> ttime = "22:45" 
        >>> dday = "2018-01-04"
        

        您可以使用 % 格式化程序,或“新的”python f-Strings

        >>> complete_t_string = "{} {}".format(dday, ttime)
        >>> complete_t_string
        '2018-01-04 22:45'
        

        现在我们有了一个完整的字符串,我们可以指定应该如何读取它并创建一个完整的时间戳:

        >>> complete_time = time.strptime(complete_t_string, "%Y-%m-%d %H:%M")
        >>> complete_time
        time.struct_time(tm_year=2018, tm_mon=1, tm_mday=4, tm_hour=22, tm_min=45, tm_sec=0, tm_wday=3, tm_yday=4, tm_isdst=-1)
        

        编辑: 有人可能会杀了我,但如果你绝对知道你只会得到两种类型的值,你可以做一个简单的 try / except 构造。它可能可以更 Python 地编写:

        try:
            time.strptime(t_string, "%H:%M")
        except ValueError:
            time.strptime(t_string, "%Y-%m-%d")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多