如何解析没有日期的时间字符串和没有时间的日期字符串?

时间:2019-01-08 09:45:29

标签: python date datetime time

有什么方法可以自动地将时间仅解析为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并获得一个时间戳。我该如何决定是否从中提取时间?

4 个答案:

答案 0 :(得分:1)

您可以使用datetime中的fromisoformat()

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

答案 1 :(得分:0)

这里有个例子。只需使用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'))

答案 2 :(得分:0)

您基本上想要的是将'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)

答案 3 :(得分:0)

您可以使用时间或日期时间模块,但要记住的一件事是,这些模块始终会创建一个对象,该对象指定一个时间点。 (此外,如果解析字符串,请考虑使用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字符串

>>> 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 /除了构造。它可能可以用Python编写:

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