我有一个表示日期的字符串:yymmdd
(例如,2017年9月1日为170901
),从datetime
对象获取。
我想用空格替换每个字段的前导零。 str.replace()
不会这样做,因为它也会替换尾随的零。
在字符串中将字符替换为另一个字符的Pythonic方法是什么?但只在某些位置(在这种情况下在字符串的偶数索引中)?
答案 0 :(得分:2)
你会认为这是优雅的方式吗?
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..
答案 1 :(得分:2)
转换为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'
答案 2 :(得分: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'
答案 3 :(得分:0)
然而,这可能会缩短;您可以尝试使用datetime
模块。
import datetime
date_str = "170901"
date = datetime.datetime.strptime(date_str, "%y%m%d")
space_date = ''.join([x.rjust(2) for x in [date.strftime("%y").lstrip('0'), str(date.month), str(date.day)]])
print(space_date) #17 9 1