Есть ли способ изменить порог для strptime ()? - PullRequest
3 голосов
/ 14 апреля 2019

Функция Python strptime() преобразует все даты с годом меньше 69 (в формате дд-мм-гг) в 20XX и выше в 19XX.

Есть лилюбой способ настроить этот параметр, отметив в документах.

datetime.strptime('31-07-68', '%d-%m-%y').date()

datetime.date (2068, 7, 31)

datetime.strptime('31-07-68', '%d-%m-%y').date()

datetimeдата (1969, 7, 31)

Ответы [ 2 ]

2 голосов
/ 14 апреля 2019

Я придумала это решение, чтобы изменить threshold на 1950-2049 в качестве примера, однако вы можете просто настроить / изменить его, как хотите, изменив значение пороговой переменной в функции:

from datetime import datetime, date

dateResult1950 = datetime.strptime('31-07-50', '%d-%m-%y').date()
dateResult2049 = datetime.strptime('31-07-49', '%d-%m-%y').date()

def changeThreshold(year, threshold=1950):
    return (year-threshold)%100 + threshold

print(changeThreshold(dateResult1950.year))
print(changeThreshold(dateResult2049.year))
#1950
#2049
1 голос
/ 14 апреля 2019

Почти наверняка ваш ответ: Не без патча Python.

Из строки 375 в CPython _strptime.py:

if group_key == 'y':
    year = int(found_dict['y'])
    # Open Group specification for strptime() states that a %y
    #value in the range of [00, 68] is in the century 2000, while
    #[69,99] is in the century 1900
    if year <= 68:
        year += 2000
    else:
        year += 1900

https://github.com/python/cpython/blob/master/Lib/_strptime.py

Вы можете смоделироватьальтернатива, выполнив свое собственное преобразование YY в YYYY перед вызовом strptime.

Технический предостерегающий ответ: Python является интерпретируемым языком, где модули импортируются понятным образом, вы можете технически манипулировать объектом _strptime при инициализациивремя выполнения и замените его собственной функцией, возможно, украшающей оригинал.

Вам понадобится очень веская причина, чтобы сделать это в рабочем коде.Я сделал это однажды с другой базовой библиотекой, чтобы обойти ошибку ОС, обсуждая с командой, когда ее нужно будет удалить.Это очень не интуитивно понятно любому будущему сопровождающему вашего кода, 9999/10000 раз будет лучше просто вызвать некоторую служебную библиотеку в вашем собственном коде.Если вам действительно нужно это сделать, достаточно легко разобраться, поэтому я пропущу пример кода, чтобы избежать копирования / вставки.

...