![](/img/trans.png)
[英]How can convert the string datetime to datetime without import datetime in python?
[英]Python: How can I convert string to datetime without knowing the format?
我有一个以字符串形式出现并代表时间的字段。 有时是 12 小时,有时是 24 小时。 可能的值:
是否有 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.