更改字符串格式(python)

更改字符串格式(python),python,string,Python,String,我想将字符串'datetime.datetime(2018,4,15,12,59)更改为格式'2018-04-15T12:59' 我创建了一个如下所示的函数: def changeDateFormat(date): newDate = [] for i in date.split('datetime')[2].split(','): newDate.append(re.sub('[() ]', '', i)) newStr = newDate[0] + '

我想将字符串
'datetime.datetime(2018,4,15,12,59)
更改为格式
'2018-04-15T12:59'

我创建了一个如下所示的函数:

def changeDateFormat(date):
    newDate = []
    for i in date.split('datetime')[2].split(','):
        newDate.append(re.sub('[() ]', '', i))
    newStr = newDate[0] + '-0' + newDate[1] + '-' + newDate[2] + 'T' + newDate[3] + ':' + newDate[4]
    return newStr
它是有效的

但是,我也希望它能够处理这样的情况:如果每个单位小于10,我希望添加一个
'0'
。现在它只添加了一个
'0'


我可以用一种非常低效的方式来做,但我想知道如何才能用一种聪明的方式来做。

我不明白为什么您使用datetime对象的字符串表示,但是
eval
是您的朋友:

>>> import datetime
>>> eval('datetime.datetime(2018, 4, 15, 12, 59)').isoformat()
'2018-04-15T12:59:00'

eval
文档:

我不明白为什么要使用datetime对象的字符串表示,但是
eval
是您的朋友:

>>> import datetime
>>> eval('datetime.datetime(2018, 4, 15, 12, 59)').isoformat()
'2018-04-15T12:59:00'

eval
文档:

我假设您试图避免使用
datetime
对象,因为在其他方面它似乎很容易混淆

我可以用一种非常低效的方式来做

你其实并不遥远,只有一行

def changeDateFormat(date):
    newDate = []
    for i in date.split('datetime')[2].split(','):
        newDate.append(re.sub('[() ]', '', i))

    pad = '-0' if newDate[1] < 10 else '-'
    newStr = newDate[0] + pad + newDate[1] + '-' + newDate[2] + 'T' + newDate[3] + ':' + newDate[4]
    return newStr
def changeDateFormat(日期):
newDate=[]
对于日期中的i.split('datetime')[2]。split(','):
newDate.append(re.sub('[()]','',i))
如果newDate[1]<10,则pad='-0'-'
newStr=newDate[0]+pad+newDate[1]+'-'+newDate[2]+'T'+newDate[3]+':'+newDate[4]
返回新闻

如果您不使用
datetime
对象,恐怕没有比这更聪明的方法了。

我假设您正在尝试避免使用
datetime
对象,因为它显然会让人困惑

我可以用一种非常低效的方式来做

你其实并不遥远,只有一行

def changeDateFormat(date):
    newDate = []
    for i in date.split('datetime')[2].split(','):
        newDate.append(re.sub('[() ]', '', i))

    pad = '-0' if newDate[1] < 10 else '-'
    newStr = newDate[0] + pad + newDate[1] + '-' + newDate[2] + 'T' + newDate[3] + ':' + newDate[4]
    return newStr
def changeDateFormat(日期):
newDate=[]
对于日期中的i.split('datetime')[2]。split(','):
newDate.append(re.sub('[()]','',i))
如果newDate[1]<10,则pad='-0'-'
newStr=newDate[0]+pad+newDate[1]+'-'+newDate[2]+'T'+newDate[3]+':'+newDate[4]
返回新闻

如果您不使用
datetime
对象,恐怕没有比这更聪明的方法了。

datetime.strftime和eval在这里很完美

import datetime
# use eval to execute the string like a a command
dt = eval('datetime.datetime(2018, 4, 15, 12, 59)')

formatted_date = dt.strftime('%Y-%m-%dT%H:%M')
输出:“2018-04-15T12:59”


参考资料:

datetime.strftime和eval在这里非常完美

import datetime
# use eval to execute the string like a a command
dt = eval('datetime.datetime(2018, 4, 15, 12, 59)')

formatted_date = dt.strftime('%Y-%m-%dT%H:%M')
输出:“2018-04-15T12:59”


参考资料:

更好的解决方案是首先避免使用datetime对象的
repr
。在这方面我真的支持@miradulo。您必须使用
repr
-字符串吗?为什么您不能访问实际的
datetime
对象?更好的解决方案是首先避免使用datetime对象的
repr
。在这一点上,我真的支持@miradulo。您必须使用
repr
-字符串吗?为什么你不能访问实际的
datetime
对象?“但是eval是你的朋友”-呃,我真的建议不要在这里或任何地方使用
eval
。几乎总有比使用
eval
更好的方法。使用
eval
可能很有诱惑力,但我会发现一些不同的东西。请看“但是eval是你的朋友”-呃,我真的建议不要在这里或任何地方使用
eval
。几乎总有比使用
eval
更好的方法。使用
eval
可能很有诱惑力,但我会发现一些不同的东西。请看,我知道这很诱人,但最好避免使用
eval
。请看。当然,这将是一个个案的情况下,是否评估是坏的。在OP的例子中,我看不出使用
eval
有多么糟糕。然而,我理解这场争论以及为什么通常应该避免。我知道这很诱人,但最好避免使用
eval
。请看。当然,这将是一个个案的情况下,是否评估是坏的。在OP的例子中,我看不出使用
eval
有多么糟糕。但是,我理解这场争论以及为什么应该避免。我并不认为OP应该这样做(他真的应该尝试获取实际的
datetime
对象,而不是
repr
),但是您可以使用
re.findall
来获取数字,并避免使用
re.sub
进行所有替换。我并不认为OP应该这样做(他确实应该尝试获取实际的
datetime
对象,而不是
repr
),但是您可以使用
re.findall
来获取数字,并避免使用
re.sub
进行所有替换。