2015-09-04 10 views
1

转换日期的列表中串月,日,年我有日期的列表中,看起来像这样的字符串:在Python

Date_List 
Out[83]: 
['2015-08-24 00:00:00', 
'2015-08-30 00:00:00', 
'2015-08-22 00:00:00', 
'2015-08-21 00:00:00', 
'2015-08-25 00:00:00', 
'2015-08-29 00:00:00'] 

我希望它是格式如下:

Date_List 
Out[83]: 
['08-24-2015', 
'08-30-2015', 
'08-22-2015', 
'08-21-2015', 
'08-25-2015', 
'08-29-2015'] 

我试图Date_List = ['{}-{}-{}'.format(m,d,y) for y, m, d in map(lambda x: str(x).split('-'), Date_List)]

这将返回

Date_List 
Out[85]: 
['08-24 00:00:00-2015', 
'08-30 00:00:00-2015', 
'08-22 00:00:00-2015', 
'08-21 00:00:00-2015', 
'08-25 00:00:00-2015', 
'08-29 00:00:00-2015'] 

有人知道如何转换,并忽略00:00:00

我也试过

​​

但这输出生成的对象?

Date_List 
Out[91]: <generator object <genexpr> at 0x2047A5A8> 

这意味着,如果我运行代码,我得到这个错误:TypeError: <generator object <genexpr> at 0x1FBCFC38> is not JSON serializable

回答

4

你非常接近;你只需要在最后一行使用列表理解而不是生成器表达式。

Date_List = (datetime.datetime.strptime(i, "%Y-%m-%d %H:%M:%S") for i in Date_List) 
Date_List = [datetime.datetime.strftime(i, "%m-%d-%Y") for i in Date_List] 

我将它清理干净,像这样:

from datetime import datetime 
from pprint import pprint 

timestamps = [ 
    '2015-08-24 00:00:00', 
    '2015-08-30 00:00:00', 
    '2015-08-22 00:00:00', 
    '2015-08-21 00:00:00', 
    '2015-08-25 00:00:00', 
    '2015-08-29 00:00:00', 
    ] 

dates = (datetime.strptime(ts, '%Y-%m-%d %H:%M:%S') for ts in timestamps) 
date_strings = [datetime.strftime(d, '%m-%d-%Y') for d in dates] 

pprint(date_strings) 

输出:

['08-24-2015', 
'08-30-2015', 
'08-22-2015', 
'08-21-2015', 
'08-25-2015', 
'08-29-2015'] 

这里有一个稍微更广义的方式来做到这一点:

from datetime import datetime 
from pprint import pprint 


def convert_timestamp(ts, from_pattern, to_pattern): 
    dt = datetime.strptime(ts, from_pattern) 
    return datetime.strftime(dt, to_pattern) 


timestamps = [ 
    '2015-08-24 00:00:00', 
    '2015-08-30 00:00:00', 
    '2015-08-22 00:00:00', 
    '2015-08-21 00:00:00', 
    '2015-08-25 00:00:00', 
    '2015-08-29 00:00:00', 
    ] 

date_strings = [convert_timestamp(ts, '%Y-%m-%d %H:%M:%S', '%m-%d-%Y') 
       for ts in timestamps] 

pprint(date_strings) 

输出:

['08-24-2015', 
'08-30-2015', 
'08-22-2015', 
'08-21-2015', 
'08-25-2015', 
'08-29-2015'] 
+0

啊!哇,我不知道生成器表达式和列表解析之间的区别,很好理解! – jenryb

0

这应该做的伎俩:

['{}-{}-{}'.format(m,d,y) for y, m, d in map(lambda x: x.split()[0].split('-'), Date_List)] 

你不需要str(x),因为它已经是一个字符串。然后你输入split()这个字符串,默认情况下这个字符串会以空格分隔,然后取第一部分([0])。然后你在连字符上写上split('-')

2

编辑:订单固定。

EDIT2:零填充固定保罗的建议后

尝试:

from dateutil import parser 
map(
    lambda d: "{0:02}-{1:02}-{2}".format(d.month, d.day, d.year), 
    map(
     lambda d: parser.parse(d), 
     dates 
    ) 
) 

["{0:02}-{1:02}-{2}".format(d.month, d.day, d.year) for d in map(lambda d: parser.parse(d), dates)] 
+0

什么是......? –

+0

您没有按请求的顺序放置日期组件。编辑:你不填充1位数组件。 –

+0

感谢评论@PauloAlmeida,修正了订单。 – sjosund