替换为仅在某些位置表示日期的字符串

2024-05-11 03:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表示日期的字符串,如:yymmdd(例如,2017年9月1日的170901),从datetime对象获得。你知道吗

我想用空格替换每个字段的前导零。str.replace()不会这样做,因为它也会替换后面的零。你知道吗

在字符串中用一个字符替换另一个字符,但只在某些位置(在本例中是在字符串的偶数索引中)的Pythonic方法是什么?你知道吗


Tags: 对象方法字符串datetimepythonic字符replace偶数
3条回答

转换为datetime对象,然后使用格式将前导空格而不是零仅应用于月份和日期:

from datetime import datetime

s = '170901'
s = '{dt:%y}{dt.month:2d}{dt.day:2d}'.format(dt=datetime.strptime(s, '%y%m%d'))
print(s)
#17 9 1

这也确保了超出天数和月份限制的值(例如42)不能被解析。你知道吗

datetime对象,您可以轻松地切换到所需的任何格式,或来回切换初始字符串和后一个字符串:

>>> '{dt:%y}{dt.month:02d}{dt.day:02d}'.format(dt=datetime.strptime(s, '%y%m%d'))
'170901'
>>> '{dt:%y} {dt:%b} {dt.day:2d}'.format(dt=datetime.strptime(s, '%y%m%d')) 
'17 Sep  1'

下面是另一个解决方案,使用一些迭代魔法来避免构建不必要的容器。但也请注意我的评论。你知道吗

>>> from itertools import izip, chain
>>> date = '170901'
>>> ''.join((chain.from_iterable((x if x != '0' else ' ', y) for x,y in izip(*[iter(date)]*2))))
'17 9 1'

你认为这是一种优雅的方式吗?你知道吗

s = '170901'    
res = ''.join([' ' if i%2==0 and x=='0' else x for i, x in enumerate(s)])
print(res)  # 17 9 1

您还可以从中创建一个函数,以便于使用:

def date_format(date_as_str):
    return ''.join([' ' if i%2==0 and x=='0' else x for i, x in enumerate(date_as_str)])

print(date_format('170901'))  # 17 9 1
print(date_format('170910'))  # 17 910  does not remove the trailing ones..

相关问题 更多 >