簡體   English   中英

如何解析沒有日期的時間字符串和沒有時間的日期字符串?

[英]How to parse time string without date and date string without 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

更新:

感謝您的回復。 認為我應該澄清問題。

程序不知道輸入中的內容( timestampdatetime ),它應該決定設置適當的類型。 問題是區分這些類型。

例如,我可以解析23:53並獲取時間戳。 我如何決定從中提取時間?

您可以從datetime使用fromisoformat()

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

你基本上想要的是讓 '23:53' 成為一個datetime.time對象,讓 '2018-01-04' 成為一個datetime.date對象。 這不能通過使用dateutil.parser.parse()來實現:

返回一個datetime.datetime對象,或者,如果fuzzy_with_tokens選項為True ,則返回一個元組,第一個元素是datetime.datetime對象,第二個元素是包含模糊標記的元組。

文檔中 所以在使用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)

這里有一個例子。 只需使用替換設置日期屬性,並使用 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'))

您可以使用 time 或 datetime 模塊,但要記住的一件事是,它們總是創建一個對象,指定一個時刻。 (另外,如果解析字符串,可以考慮使用strptime函數,分別顯示為string、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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM