regex 如何操作没有4位数年份的日期?是否可以提取这个年份数字并对其进行调整,以便datetime可以操作它?

7z5jn7bk  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(125)

每当我试图将年份不是4位数的日期传递给datetime模块的某个函数时,就会出现ValueError,在本例中,要执行的操作是加减天数

import datetime

def add_or_subtract_days(datestr, days, operation):
    if operation == "add" : input_text = (datetime.datetime.strptime(datestr, "%Y-%m-%d") + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')
    elif operation == "subtract" : input_text = (datetime.datetime.strptime(datestr, "%Y-%m-%d") - datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')

    return input_text

input_text = add_or_subtract_days("2023-01-20", "5", "add")
print(repr(input_text))  # ---> '2023-01-25'

input_text = add_or_subtract_days("999-12-27", "5", "add")
print(repr(input_text))  # ---> ValueError: time data '999-12-27' does not match format '%Y-%m-%d'

input_text = add_or_subtract_days("12023-01-20", "5", "add")
print(repr(input_text))  # ---> ValueError: time data '12023-01-20' does not match format '%Y-%m-%d'

我想到的一件事是,识别这些问题案例有一个例外,我设法提取了年数,也许它会帮助我以某种方式与它进行操作,使它在与datetime加减天时不会产生问题,您还必须考虑到,在加减天时,您还可以更改月数和年数,这是一个非常重要的考虑因素,给我带来了很多问题,因为我不知道如何解决它。

import datetime, re

def add_or_subtract_days(datestr, days, operation):

    try:
        if operation == "add" : input_text = (datetime.datetime.strptime(datestr, "%Y-%m-%d") + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')
        elif operation == "subtract" : input_text = (datetime.datetime.strptime(datestr, "%Y-%m-%d") - datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')

    except ValueError:
        m1 = re.search( r"(?P<year>\d*)-(?P<month>\d{2})-(?P<startDay>\d{2})", datestr, re.IGNORECASE, )
        if m1:
            ref_year = str(m1.groups()[0])
            print(ref_year)

    return input_text

我已经设法提取了年份,但是我想不出应该使用哪种算法将年份截断为支持日期时间的值,然后将其连接(保持逻辑)以获得正确的日期,尽管没有4位数的年份
比如说...
第1个月2日至第1个月3日至第1个月4日至第1个月5日至第1个月6日至第21个月1日至第8个月1日
一个月九个月一个月+一个月十个月一个月--〉一个月十一个月一个月十二个月一个月+一个月十三个月一个月--〉1个月十四个月--〉一个月十五个月
x个1米16英寸1x + x个1米17英寸1x--〉x个1米18英寸1x个1米19英寸1x + x个1米20英寸1x--〉0个1米21英寸1x--〉x个1米22英寸1x
一个月23个月1x+一个月24个月1x--〉一个月25个月1x一个月26个月1x+一个月27个月1x--〉0个月1个月28个月1x--〉一个月29个月1x
一个月三十日至一个月三十一日--〉一个月三十二日至一个月三十三日至一个月三十四日至一个月三十四日--〉00一个月三十五日至一个月三十六日

jq6vz3qz

jq6vz3qz1#

将'99'作为年份是有问题的,因为Python不知道您实际想要的日期(2099年、1999年或3099年等)。
% Y告诉python你想解析一个4个字符的日期。你可以用% y来表示2:

>>> datetime.datetime.strptime('99-12-29', '%y-%m-%d')
datetime.datetime(1999, 12, 29, 0, 0)
>>>

如果您想要年份0099,则需要4个字符:

>>> datetime.datetime.strptime('0099-12-29', '%Y-%m-%d')
datetime.datetime(99, 12, 29, 0, 0)
>>>

来自备注:将所有日期移动到4个字符,然后解析时间,这样更容易:

def add_or_subtract_days(datestr, days, operation):
    to_add = 4 - len(datestr[:datestr.find('-')])
    datestr = ('0' * to_add) + datestr

    if operation == "add":
        input_text = (datetime.datetime.strptime(datestr, "%Y-%m-%d") + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')
    elif operation == "subtract":
        input_text = (datetime.datetime.strptime(datestr, "%Y-%m-%d") - datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')

    return input_text

前两行我们计算需要在日期的开头加上多少个0。第二行是一个鲜为人知的python黑客,我们可以将一个字符串乘以一个int,得到一个n的重复字符串。这显然不适用于大于9999的日期,因为python MAXYEAR是9999。

input_text = add_or_subtract_days("2023-01-20", "5", "add")
print(repr(input_text))  # ---> '2023-01-25'

input_text = add_or_subtract_days("999-12-27", "5", "add")
print(repr(input_text))  # ---> '1000-01-01'

input_text = add_or_subtract_days("99-01-20", "5", "add")
print(repr(input_text))  # ---> '0099-01-25'

相关问题