【问题标题】:Abbreviated month or day of the week with a DOT (".") at the end of the string字符串末尾带有点(“.”)的缩写月份或星期几
【发布时间】:2021-05-12 14:57:22
【问题描述】:

我需要用 python 更改很多 strings,其中 Spanish 日期格式(DDMMMYYYY,西班牙语中的 MMM 缩写月份)采用其他日期时间格式,但我是有问题,因为我的语言环境西班牙语设置有一个“。” (a dot) 以缩写月份格式更改此格式时在字符串末尾。

默认情况下,python 采用英语版本的语言,但我可以使用 locale 库更改语言。 当我选择 'esp''es_ES.utf8' 时,会出现缩写月份末尾的点。

这是否取决于我的 Windows 10 的区域设置? (我检查了一下,似乎一切正常)它是否取决于 LOCALE 库设置? UBUNTU 中的相同代码运行正常(没有重点)

我该如何解决这个问题?

我不想像那样转换所有字符串..

str_date = str_date[:5] + "." + str_date[5:]

非常感谢!!

示例(之前我使用语言环境更改语言):

>>> datetime.strptime('2021-01-18', '%Y-%m-%d').strftime('%b')
'ene.'
>>> print(datetime.strptime('18ene2021', '%d%b%Y'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\galonsoi\AppData\Local\Programs\Python\Python36\lib\_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "C:\Users\galonsoi\AppData\Local\Programs\Python\Python36\lib\_strptime.py", line 362, in _strptime
    (data_string, format))
ValueError: time data '18ene2021' does not match format '%d%b%Y'
>>> print(datetime.strptime('18ene.2021', '%d%b%Y'))
2021-01-18 00:00:00                                       ----> THIS IS OK BECAUSE I WRITE THE DOT AT THE END OF THE ABBREVIATED MONTH

示例的完整序列

>>> import locale
>>> from datetime import datetime
>>>
>>> locale.getlocale()
(None, None)
>>> print (datetime.strptime('2021-01-18', '%Y-%m-%d').strftime('%b'))
Jan
>>> locale.setlocale(locale.LC_ALL, '')
`Spanish_Spain.1252`
>>> locale.getlocale()
(`es_ES`, `cp1252`)
#INCORRECT FORMAT, ADD A "." AT THE END
>>> print (datetime.strptime('2021-01-18', '%Y-%m-%d').strftime('%b'))
ene.
>>> locale.setlocale(locale.LC_ALL, 'es_ES.UTF-8')
`es_ES.UTF-8`
#FORMATO INCORRECTO, AÑADE UN "." a may
>>> print (datetime.strptime('2021-01-18', '%Y-%m-%d').strftime('%b'))
ene.
>>> print(datetime.strptime('18ene2021', '%d%b%Y'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\galonsoi\AppData\Local\Programs\Python\Python36\lib\_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "C:\Users\galonsoi\AppData\Local\Programs\Python\Python36\lib\_strptime.py", line 362, in _strptime
    (data_string, format))
ValueError: time data '18ene2021' does not match format '%d%b%Y'
>>> print(datetime.strptime('18ene.2021', '%d%b%Y'))
2021-01-18 00:00:00                                       ----> THIS IS OK BECAUSE I WROTE THE DOT AT THE END OF THE ABBREVIATED MONTH

【问题讨论】:

  • 澄清问题:您尝试清理的数据具有西班牙月份名称(例如“ene”)但没有点,这是使用 strptime 解析所必需的?
  • 没错,我的琴弦没有圆点,而圆点是清理它所必需的。我在 ubuntu 中也有同样的功能,它工作正常,因为不需要点。

标签: python python-3.x datetime utf-8 locale


【解决方案1】:

您可以使用 dateutil 的解析器,您可以在其中通过 parser.parserinfo 类设置自定义月份名称。例如:

import locale
locale.setlocale(locale.LC_ALL, 'Spanish_Spain.1252') # set locale for reproducibility
import calendar
from dateutil import parser
    
# subclass parser.parserinfo and set custom month names with dots stripped:
class LocaleParserInfo(parser.parserinfo):
    MONTHS = [(ma.strip('.'), ml) for ma, ml in zip(calendar.month_abbr, calendar.month_name)][1:]
    
s = '18ene2021'
print(parser.parse(s, parserinfo=LocaleParserInfo()))
# 2021-01-18 00:00:00

【讨论】:

  • 非常感谢!这是一个绝妙而优雅的解决方案!唯一的问题是您需要更改每个字符串.. 就像我说的,在 ubuntu 中这一步不是必需的,我认为通过更改 Windows10 的区域设置或触摸 LOCALE 中的某些设置,我可以有相同的ubuntu
  • @GonzaloAB 当然,解决问题的“根源”会更好,但是这样,您应该能够使其跨平台工作。对于德语语言环境,我在 Windows 和 Linux 上遇到了类似的问题——我认为这可以追溯到特定于操作系统的库。所以我最终也使用了一种解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2021-12-16
  • 2013-02-15
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多