使用 dateutil 解析器时,有没有办法知道给定的不完整日期中缺少哪些值?
is there a way to know which values are missing in a given incomplete date when using dateutil parser?
我正在使用一项功能,在用户指定日期(可能不完整)后生成持续时间。
- 如果是完整日期(xxxx-xx-xx),则周期应该是xxxx-xx-xx 0:00到xxxx-xx-xx 23:59.
- 如果是只有年月xxxx-xx的不完整日期,则周期应该是xxxx-xx-010:00到xxxx-xx-3123:59.
- 如果是只有xxxx年的不完整日期,则时间段应该是xxxx-01-010:00到xxxx-12-3123:59.
用户输入可以是任何形式。
我正在使用这个超级酷的 dateutil.parse,它在捕获日期信息方面运行顺畅。它还可以捕获不完整的日期并将缺少的设置为默认值。
例如:
out_date = dparser.parse("2021",default=datetime.datetime(2021, 1, 1))
#out 2021-01-01 00:00:00
out_date = dparser.parse("2021 june",default=datetime.datetime(2021, 1, 1))
#out 2021-06-01 00:00:00
out_date = dparser.parse("2021 sep 17",default=datetime.datetime(2021, 1, 1))
#out 2021-09-17 00:00:00
由于我关心的是 return 一个句点,我想区分输入“2021”和“2021-01-01”,其中输出与上述方法相同。
基本上,我想要捕获缺失值,以便我可以按需要处理它们。
例如:
input = "2021" > output = (2021, false, false)
input = "2021 jan" > output = (2021, 01, false)
input = "2021 jan 15" > output = (2021, 01, 15)
非常感谢任何帮助。
PS:输入可以不符合结构,例如“2021/01/01”、“2021 年 1 月 15 日”、“2021 年 1 月”
如果这是您的需要:
input = "2021" > output = (2021, false, false)
input = "2021 jan" > output = (2021, 01, false)
input = "2021 jan 15" > output = (2021, 01, 15)
那么这应该可行:
from datetime import datetime
def process_date_str(date_str: str) -> tuple:
tokens = date_str.split()
if len(tokens) == 1:
year = tokens[0]
return year, False, False
if len(tokens) == 2:
year, month = tokens
month = str(datetime.strptime(month, "%b").month).zfill(2)
return year, month, False
if len(tokens) == 3:
year, month, day = tokens
month = str(datetime.strptime(month, "%b").month).zfill(2)
return year, month, day
if __name__ == "__main__":
year_only = "2021"
year_month = "2021 jan"
year_month_day = "2021 jan 15"
date_strs = [year_only, year_month, year_month_day]
for date_str in date_strs:
print(process_date_str(date_str))
这给了我:
(.venv) ➜ date-parser python main.py
('2021', False, False)
('2021', '01', False)
('2021', '01', '15')
我将所有内容都保留为 str
,但您可以根据需要进行转换。很难从您的示例中判断出所需的数据类型。
以下技巧对我有用。希望这会帮助任何寻找这种情况的人。
import datetime
import dateutil.parser as dparser
def date_checker(date_input):
out_dict = ['false','false','false']
out_check_a = dparser.parse(date_input,default=datetime.datetime(2020, 1, 1))
out_check_b = dparser.parse(date_input, default=datetime.datetime(2021, 12, 31))
if(out_check_a.year==out_check_b.year):
out_dict[0] = out_check_a.year
if (out_check_a.month == out_check_b.month):
out_dict[1] = out_check_a.month
if (out_check_a.day == out_check_b.day):
out_dict[2] = out_check_a.day
return out_dict
print(date_checker('2021')) #output [2021, 'false', 'false']
print(date_checker('2021 jan')) #output [2021, 1, 'false']
print(date_checker('2021 jan 15')) #output [2021, 1, 15]
print(date_checker('2021/01/01')) #output [2021, 1, 1]
print(date_checker('January 15, 2021')) #output [2021, 1, 15]
print(date_checker('January 2021')) #output [2021, 1, 'false']
我正在使用一项功能,在用户指定日期(可能不完整)后生成持续时间。
- 如果是完整日期(xxxx-xx-xx),则周期应该是xxxx-xx-xx 0:00到xxxx-xx-xx 23:59.
- 如果是只有年月xxxx-xx的不完整日期,则周期应该是xxxx-xx-010:00到xxxx-xx-3123:59.
- 如果是只有xxxx年的不完整日期,则时间段应该是xxxx-01-010:00到xxxx-12-3123:59.
用户输入可以是任何形式。
我正在使用这个超级酷的 dateutil.parse,它在捕获日期信息方面运行顺畅。它还可以捕获不完整的日期并将缺少的设置为默认值。 例如:
out_date = dparser.parse("2021",default=datetime.datetime(2021, 1, 1))
#out 2021-01-01 00:00:00
out_date = dparser.parse("2021 june",default=datetime.datetime(2021, 1, 1))
#out 2021-06-01 00:00:00
out_date = dparser.parse("2021 sep 17",default=datetime.datetime(2021, 1, 1))
#out 2021-09-17 00:00:00
由于我关心的是 return 一个句点,我想区分输入“2021”和“2021-01-01”,其中输出与上述方法相同。
基本上,我想要捕获缺失值,以便我可以按需要处理它们。 例如:
input = "2021" > output = (2021, false, false)
input = "2021 jan" > output = (2021, 01, false)
input = "2021 jan 15" > output = (2021, 01, 15)
非常感谢任何帮助。
PS:输入可以不符合结构,例如“2021/01/01”、“2021 年 1 月 15 日”、“2021 年 1 月”
如果这是您的需要:
input = "2021" > output = (2021, false, false)
input = "2021 jan" > output = (2021, 01, false)
input = "2021 jan 15" > output = (2021, 01, 15)
那么这应该可行:
from datetime import datetime
def process_date_str(date_str: str) -> tuple:
tokens = date_str.split()
if len(tokens) == 1:
year = tokens[0]
return year, False, False
if len(tokens) == 2:
year, month = tokens
month = str(datetime.strptime(month, "%b").month).zfill(2)
return year, month, False
if len(tokens) == 3:
year, month, day = tokens
month = str(datetime.strptime(month, "%b").month).zfill(2)
return year, month, day
if __name__ == "__main__":
year_only = "2021"
year_month = "2021 jan"
year_month_day = "2021 jan 15"
date_strs = [year_only, year_month, year_month_day]
for date_str in date_strs:
print(process_date_str(date_str))
这给了我:
(.venv) ➜ date-parser python main.py
('2021', False, False)
('2021', '01', False)
('2021', '01', '15')
我将所有内容都保留为 str
,但您可以根据需要进行转换。很难从您的示例中判断出所需的数据类型。
以下技巧对我有用。希望这会帮助任何寻找这种情况的人。
import datetime
import dateutil.parser as dparser
def date_checker(date_input):
out_dict = ['false','false','false']
out_check_a = dparser.parse(date_input,default=datetime.datetime(2020, 1, 1))
out_check_b = dparser.parse(date_input, default=datetime.datetime(2021, 12, 31))
if(out_check_a.year==out_check_b.year):
out_dict[0] = out_check_a.year
if (out_check_a.month == out_check_b.month):
out_dict[1] = out_check_a.month
if (out_check_a.day == out_check_b.day):
out_dict[2] = out_check_a.day
return out_dict
print(date_checker('2021')) #output [2021, 'false', 'false']
print(date_checker('2021 jan')) #output [2021, 1, 'false']
print(date_checker('2021 jan 15')) #output [2021, 1, 15]
print(date_checker('2021/01/01')) #output [2021, 1, 1]
print(date_checker('January 15, 2021')) #output [2021, 1, 15]
print(date_checker('January 2021')) #output [2021, 1, 'false']