有什么方法可以自动地将时间仅解析为datetime.time
对象(或类似对象)的字符串吗?与datetime.date
相同。
我尝试过dateutil,arrow,moment,pandas.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:
感谢您的答复。认为我应该澄清这个问题。
程序不知道输入中的内容(timestamp
,date
或time
),它应该决定设置适当的类型。问题是要区分这些类型。
例如,我可以解析23:53
并获得一个时间戳。我该如何决定是否从中提取时间?
答案 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()
我猜想您需要自己解释输入字符串以定义您要解析的时间或日期。当您这样做时,仍然可以使用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")