簡體   English   中英

Python:如何在不知道格式的情況下將字符串轉換為日期時間?

[英]Python: How can I convert string to datetime without knowing the format?

我有一個以字符串形式出現並代表時間的字段。 有時是 12 小時,有時是 24 小時。 可能的值:

  1. 8:26
  2. 上午 08:26
  3. 13:27

是否有 function 可以通過智能將這些轉換為時間格式? 選項 1 沒有 am,因為它是 24 小時格式,而選項 2 前面有一個 0,而選項 3 顯然是 24 小時格式。 Python/lib 中是否有 function:

time = func(str_time)

超短答案:

from dateutil import parser
parser.parse("8:36pm")
>>>datetime.datetime(2015, 6, 26, 20, 36)
parser.parse("18:36")
>>>datetime.datetime(2015, 6, 26, 18, 36)

Dateutil應該可用於python安裝; 不需要像熊貓這樣的大東西

如果要從datetime對象提取時間:

t = parser.parse("18:36").time()

這將給您一個time對象(如果這對您有更多幫助)。 或者,您可以提取單個字段:

dt = parser.parse("18:36")
hours = dt.hour
minute = dt.minute

熊貓有一種這樣的功能

import pandas as pd
d = pd.to_datetime('<date_string>')

使用正則表達式將字符串切割成['year', 'month', 'day', 'hour', 'minutes', 'seconds']然后解壓並填入 datetime class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0) ,這是我目前測試最快的方式。

    import re
    import pandas as pd
    import datetime
    import timeit

    def date2timestamp_anyformat(format_date):
        numbers = ''.join(re.findall(r'\d+', format_date))
        if len(numbers) == 8:
            d = datetime.datetime(int(numbers[:4]), int(numbers[4:6]), int(numbers[6:8]))
        elif len(numbers) == 14:
            d = datetime.datetime(int(numbers[:4]), int(numbers[4:6]), int(numbers[6:8]), int(numbers[8:10]), int(numbers[10:12]), int(numbers[12:14]))
        elif len(numbers) > 14:
            d = datetime.datetime(int(numbers[:4]), int(numbers[4:6]), int(numbers[6:8]), int(numbers[8:10]), int(numbers[10:12]), int(numbers[12:14]), microsecond=1000*int(numbers[14:]))
        else:
            raise AssertionError(f'length not match:{format_date}')
        return d.timestamp()

和速度測試:

    print('regex cut:\n',timeit.timeit(lambda: datetime.datetime(*map(int, re.split('-|:|\s', '2022-08-13 12:23:44.234')[:-1])).timestamp(), number=10000))
    print('pandas to_datetime:\n', timeit.timeit(lambda: pd.to_datetime('2022-08-13 12:23:44.234').timestamp(), number=10000))
    print('datetime with known format:\n',timeit.timeit(lambda: datetime.datetime.strptime('2022-08-13 12:23:44.234', '%Y-%m-%d %H:%M:%S.%f').timestamp(), number=10000))
    print('regex get number first:\n',timeit.timeit(lambda: date2timestamp_anyformat('2022-08-13 12:23:44.234'), number=10000))
    print('dateutil parse:\n', timeit.timeit(lambda: parser.parse('2022-08-13 12:23:44.234').timestamp(), number=10000))

結果:

regex cut:
 0.040550945326685905
pandas to_datetime:
 0.8012433210387826
datetime with known format:
 0.09105705469846725
regex get number first:
 0.04557646345347166
dateutil parse:
 0.6404162347316742

暫無
暫無

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

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