1

我有一个格式为“2010 年 10 月 28 日”(或类似)的日期。现在我想将月份的全名更改为更短的版本(在本例中为 Oct)。为此,我准备了一本字典:

_mapping = {'January': 'Jan', 
            'February': 'Feb', 
            'March': 'Mar', 
            'April': 'Apr', 
            'May': 'May', 
            'June': 'Jun', 
            'July': 'Jul', 
            'August': 'Aug', 
            'September': 'Sep', 
            'October': 'Oct', 
            'November': 'Nov', 
            'December': 'Dec'}

在替换的方法中,我写了以下内容:

def fetch(self, pno):
    ...
    date = #get data (working fine)
    for l, s in self._mapping.iteritems():
        pubdate = date.replace(l, s)
        print l + " -> " + pubdate #this is only for debug
    (pubd_month, self.pubd_day, self.pubd_year) = pubdate.split(' ')
    print pubd_month, self.pubd_day, self.pubd_year
    print pubdate

执行结果是:

February -> October 28, 2008
October -> Oct 28, 2008
January -> October 28, 2008
April -> October 28, 2008
November -> October 28, 2008
March -> October 28, 2008
August -> October 28, 2008
May -> October 28, 2008
December -> October 28, 2008
June -> October 28, 2008
September -> October 28, 2008
July -> October 28, 2008
October
October 28, 2008

正如你所看到的,当它找到十月时,替换似乎没问题,但在循环之外我又得到了完整的月份名称。我做错了什么?

另一个问题:有没有更短的方法来做到这一点?

4

2 回答 2

3

因为您总是在 上替换pubdate为替换date,所以您会覆盖任何成功的匹配。

在替换之前先测试月份是否在字符串中,或​​者用结果替换:pubdatepubdate.replace()

pubdate = #get data (working fine)
for l, s in self._mapping.iteritems():
    pubdate = pubdate.replace(l, s)

或者,使用测试:

date = #get data (working fine)
for l, s in self._mapping.iteritems():
    if l in date:
        pubdate = date.replace(l, s)

pubdate如果找到超过一个月的名称,后者仍然会导致被覆盖。或者,如果只有一个月的比赛,请使用break提前结束循环:

date = #get data (working fine)
for l, s in self._mapping.iteritems():
    if l in date:
        pubdate = date.replace(l, s)
        break

警告:如果没有找到匹配项,pubdate将永远不会被分配,你会得到一个UnboundLocal例外。

于 2013-09-21T13:06:01.893 回答
3

没有必要_mapping。如果您使用datetime.datetime对象,该strftime方法可以为您返回缩写月份:

import datetime as DT

def short_date(date):
    date = DT.datetime.strptime(date, '%B %d, %Y')
    return date.strftime('%b %d, %Y')

print(short_date('October 28, 2010'))

印刷

Oct 28, 2010

strptime(date, '%B %d, %Y')如果您的日期字符串有多种格式,那么您可以使用 dateutil 的parser.parse方法来代替解析它们。为了获得最大的灵活性,您最好datetime.datetime尽早将日期字符串解析为对象,并strftime尽可能晚地使用它来格式化它们。

于 2013-09-21T13:10:46.243 回答