有沒有一種簡單的方法可以將“11 月 31 日”這樣的無效日期減少到當月的最后一個有效日期?11 月 31 日不存在,因為 11 月沒有 31 天。
我正在使用的日期字串非常混亂和不一致,所以我想避免嘗試對字串或類似的東西進行切片。當日期無效時,Parser.parse() 非常適合我的用例。
from dateutil import parser
datstrings_list = ["Nov 31, 1976", "11/31/76", "11/31/1976", "November 31st, 1976","1/32/1976"]
date_list = []
for i in datestrings_list:
datestring = i
date = parser.parse(datestring).date()
date_list.append(date)
產生錯誤:
ParserError: day is out of range for month: Nov 31, 1976
date_list 的期望值:
[datetime.date(1976, 11, 30), datetime.date(1976, 11, 30),datetime.date(1976, 11, 30),datetime.date(1976, 11, 30), datetime.date(1/31/1976)]
uj5u.com熱心網友回復:
您可以使用while回圈并以這種方式完成它。
from dateutil import parser
datestring = "Nov 31, 1976"
date = None
while date is None:
date_array = datestring.split()
try:
date = parser.parse(datestring).date()
except parser._parser.ParserError:
day = int("".join(x for x in date_array[1] if x.isdigit()))-1
date_array[1] = f"{day},"
datestring = f"{date_array[0]} {date_array[1]} {date_array[2]}"
print(date)
這應該可以滿足您的需求。
問題更新:
from dateutil import parser
import calendar
datestrings_list = ["Nov 31, 1976", "11/31/76", "11/31/1976", "November 31st, 1976","1/32/1976"]
c = {month: index for index, month in enumerate(calendar.month_abbr) if month}
# Format string list
def standardise_list(date_list):
lst = []
for index, ls in enumerate(date_list):
if "/" not in ls:
ds = ls.split()
if len(ds[0]) > 3:
ds[0] = ds[0][:3]
if len(ds[1]) > 2:
ds[1] = ds[1][:2]
nd = f"{c[ds[0]]}/{ds[1]}/{ds[2]}"
lst.append(nd)
else:
lst.append(ls)
return lst
# Fix out of range dates
def date_fix(datestring):
date = None
while date is None:
date_array = datestring.split("/")
try:
date = parser.parse(datestring).date()
except parser._parser.ParserError:
day = int("".join(x for x in date_array[1] if x.isdigit()))-1
date_array[1] = f"{day}"
datestring = f"{date_array[0]} {date_array[1]} {date_array[2]}"
return date
standard_string_list = standardise_list(datestrings_list)
dates = [date_fix(ds) for ds in standard_string_list]
print(dates)
>>> [datetime.date(1976, 11, 30), datetime.date(1976, 11, 30), datetime.date(1976, 11, 30), datetime.date(1976, 11, 30), datetime.date(1976, 1, 31)]
uj5u.com熱心網友回復:
我不確定是否有一種簡單的方法可以用該月的最大天數替換無效日期,但一種方法是使用calendar模塊下的輔助函式來獲取給定月份和年份的最大天數:
import calendar
# Mapping of month abbreviation to month index. Ex: 'Jan': 1
month_indices = {month: i for i, month in enumerate(calendar.month_abbr)}
datestring = "Nov 31, 1976"
month_abbr, day, yr = datestring.replace(',', '').split()
last_day_in_month = calendar.monthrange(int(yr), month_indices[month_abbr])[-1]
assert last_day_in_month == 30
或者,如果您有一個類似 的日期字串11/31/76,您可以通過以下方式獲得本月和本年的最大天數:
datestring = "11/31/76"
month, day, year = map(int, datestring.split('/'))
# checking if we have abbreviation like `76` for year
# we have to make sure the year has 4 digits, otherwise `monthrange`
# appears to parse the year as `2076`, which is not what we want.
if year < 100:
year = 1900
assert calendar.monthrange(year, month)[-1] == 30
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/337494.html
上一篇:如何在不同的單詞中拆分字串
