我想将日期从一种格式转换为另一种格式。比如说,我有一个日期:
February 27, 1820
April 3, 1885
我想把它转换成
27 February 1820
3 April 1885
I try but get error:
dt = "February 12, 1809"
dt = datetime.strptime('%d %b %Y')
任何形式的帮助都将非常感激。
time.strftime
和datetime.datetime.strftime
不接受小于1900的年份值。所以它看起来像有工作的re
(虽然这是一个坏的风格,使用它为这样的任务):
>>> import re
>>> s = 'February 27, 1820'
>>> month, day, year = re.findall('(w+) (d+), (d+)', s)[0]
>>> '%s %s %s' % (day, month, year)
'27 February 1820'
昨天,我从Kirk Strauser那里了解到strptime())比其他解决方案慢得多:参见此文件
所以我的建议是用另一种方式。例:
import re
ss = '''February 27, 1820
a line
April 3, 1885'''
regx = re.compile('(January|February|March|'
'April|May|June'
'July|August|September|'
'October|November|December)'
' '
'(d|[012]d|3[01])'
',(?= d{4})')
print regx.findall(ss)
print
print regx.sub('\2 \1',ss)
编辑1
程序的速度可以使用regx.sub(repl,ss)来提高,其中repl()是一个不提取月份和日期作为组(1)和组(2)的函数,而是通过切片:
import re
from time import clock
ss = '''February 27, 1820
a line
April 3, 1885'''
regx = re.compile('(January|February|March|'
'April|May|June'
'July|August|September|'
'October|November|December)'
' '
'(d|[012]d|3[01])'
',(?= d{4})')
print regx.findall(ss)
print
te = clock()
for i in xrange(10000):
x = regx.sub('\2 \1',ss)
print clock()-te
print x
print
regx = re.compile('(?:January|February|March|'
'April|May|June'
'July|August|September|'
'October|November|December)'
' '
'(?:d|[012]d|3[01]),'
'(?= d{4})')
def repl(mat):
sp = mat.group().split()
return sp[1][0:-1] + ' ' + sp[0]
te = clock()
for i in xrange(1):
y = regx.sub(repl,ss)
print clock()-te
print y
结果[('February', '27'), ('April', '3')]
2.52965614345
27 February 1820
a line
3 April 1885
0.378833622709
27 February 1820
a line
3 April 1885
PS:我也知道strftime和strptime有一个时间跨度的问题(不是1900年之前),这就是为什么我立即选择用正则表达式来处理这个问题。人们发现正则表达式太重,太令人印象深刻,以至于无法使用它们,但我不理解这种趋势,因为只要你掌握了一点正则表达式,你就可以以高效率和速度做很多事情。
使用datetime.datetime。或parsedatetime或dateutil将字符串解析为日期。
然后使用datetime.datetime.strftime将datetime对象格式化为使用所需格式的字符串
您可以使用strptime
/strftime
:
from datetime import datetime
date = datetime.strptime('February 27, 1820', '%B %d, %Y')
new_date = date.strftime('%d %b %Y')
然而,有一个问题。strftime
似乎有年岁问题<在一些平台上是1900。这里也有一个解决方法>