所以我知道 Python 字符串是不可变的,但我有一个字符串:
c['date'] = "20110104"
我想转换成
c['date'] = "2011-01-04"
我的代码:
c['date'] = c['date'][0:4] + "-" + c['date'][4:6] + "-" + c['date'][6:]
好像有点绕,不是吗?最好将它保存为一个单独的变量然后做同样的事情吗?还是基本没有区别?
所以我知道 Python 字符串是不可变的,但我有一个字符串:
c['date'] = "20110104"
我想转换成
c['date'] = "2011-01-04"
我的代码:
c['date'] = c['date'][0:4] + "-" + c['date'][4:6] + "-" + c['date'][6:]
好像有点绕,不是吗?最好将它保存为一个单独的变量然后做同样的事情吗?还是基本没有区别?
你可以用.join()
它来清理一下:
d = c['date']
'-'.join([d[:4], d[4:6], d[6:]])
Dates are first class objects in Python, with a rich interface for manipulating them. The library is datetime.
> import datetime
> datetime.datetime.strptime('20110503','%Y%m%d').date().isoformat()
'2011-05-03'
Don't reinvent the wheel!
你最好使用字符串格式而不是字符串连接
c['date'] = '{}-{}-{}'.format(c['date'][0:4], c['date'][4:6], c['date'][6:])
字符串连接通常较慢,因为正如您在上面所说的字符串是不可变的。
s = '20110104'
def option_1():
return '-'.join([s[:4], s[4:6], s[6:]])
def option_1a():
return '-'.join((s[:4], s[4:6], s[6:]))
def option_2():
return '{}-{}-{}'.format(s[:4], s[4:6], s[6:])
def option_3():
return '%s-%s-%s' % (s[:4], s[4:6], s[6:])
def option_original():
return s[:4] + "-" + s[4:6] + "-" + s[6:]
在每个上运行%timeit
都会产生这些结果
所以......选择最易读的,因为性能改进是微不足道的
我可能会这样做,而不是有很大的收获:
d = c['date']
c['date'] = '%s-%s-%s' % (d[:4], d[4:6], d[6:])
最大的改进(恕我直言)是避免字符串连接。
我通常不会说“使用正则表达式”,但这是一个很好的用例:
import re
c['date']=re.sub(r'.*(\w{4})(\w{2})(\w{2}).*',r"\1-\2-\3",c['date'])
我不确定您是否要将其转换为正确的日期时间对象,或者只是对格式进行硬编码,您可以执行以下操作:
from datetime import datetime
result = datetime.strptime(c['date'], '%Y%m%d')
print result.date().isoformat()
输入:'20110104'
输出:'2011-01-04'
将连字符添加到日期时间的一系列字符串中
import datetime
for i in range (0,len(c.date)):
c.date[i] = datetime.datetime.strptime(c.date[i],'%Y%m%d').date().isoformat()