我想找到最好的方式来格式化日期为YYYY,YYYYMM或YYYYMMDD。
到目前为止,我得到的是:
# gets the position of a character in the format
def get_pos(format, letter, number):
it_number = 0
it_pos = 0
for char in format:
if char == letter:
it_number += 1
if it_number == number:
return(it_pos)
it_pos += 1
return(-1)
# loops through all the characters forming a number
def format_loop(string, old_format, letter):
new = ''
pos = -2
it = 1
while(pos != -1):
pos = get_pos(old_format, letter, it)
if(pos >= 0):
new += string[pos]
it += 1
return(new)
# format a date
def date_format(string, old_format, new_format, delim):
new = format_loop(string, old_format, 'Y')
if(new_format in 'MD'):
new += delim + format_loop(string, old_format, 'M')
if(new_format == 'D'):
new += delim + format_loop(string, old_format, 'D')
return(new)函数的取用参数依次是要格式化的日期字符串、其当前格式、以“Y”、“M”或“D”形式表示的所需格式,以及在数字之间插入的可选分隔符。
我愿意听取关于缩短和优化代码以及编码风格和变量/函数命名的建议。
发布于 2018-11-27 11:40:11
在解析和操作日期(或时间)时,应该使用datetime模块。
它同时支持用给定格式解析字符串和格式化datetime具有另一种给定格式的。它唯一不支持的是在数字之间添加一个分隔符:
import datetime
def date_format(string, old_format, new_format):
return datetime.strptime(string, old_format).strftime(new_format)请注意,格式必须符合datetimeS格式说明符。特别是,这意味着您必须分别使用"YYYY"、"YYYYMM"和"YYYYMMDD",而不是"%Y"、"%Y%m"和"%Y%m%d"。这些格式说明符不是任意的,它们与相应的C库(已经存在了相当一段时间)所支持的格式说明符非常相似。
所以,除非您真的需要这个分隔符,否则我会使用它,因为它非常简单,而且更容易理解(特别是其他人)。即使需要分隔符,也可能更容易操作此函数的输出来包含它。
发布于 2018-11-26 13:01:49
对于第一个循环,有一个名为enumerate()的简洁的小函数,它允许您遍历一个对象并访问元素和迭代号。
您还可以删除各种括号,用于returned值和while循环(尽管对于大的条件,有时保留括号是很方便的)。
def get_pos(format, letter, number):
it_number = 0
# it_pos = 0 <--- not needed anymore because of the
for it_pos, char in enumerate(format): # <--- enumerate
if char == letter:
it_number += 1
if it_number == number:
return it_pos
# it_pos += 1 <--- same thing here
return -1对于第二个函数,我建议使用while True和break,这样您就不必事先声明pos=-2。
def format_loop(string, old_format, letter):
new = ''
# pos = -2 <--- replaced by a break
it = 1
while True:
pos = get_pos(old_format, letter, it)
if pos == -1:
break
elif pos >= 0:
new += string[pos]
it += 1
return new另外,我不知道是否有官方建议,但我喜欢在特殊情况下使用非常显式的返回值,例如字符串"not found"而不是-1。当您阅读if pos=="not found": break时,这使得代码比Python更英文版,我非常喜欢它。
https://codereview.stackexchange.com/questions/208436
复制相似问题