日期序数输出?

时间:2009-04-11 00:22:32

标签: python

我想知道在python中给出一个数字是否有一种快速简便的输出序数的方法。

例如,给定数字1,我想输出"1st",数字2"2nd"等等。

这是用于处理面包屑路径中的日期

Home >  Venues >  Bar Academy >  2009 >  April >  01 

是当前显示的内容

我希望有一些基本的内容

Home >  Venues >  Bar Academy >  2009 >  April >  1st

14 个答案:

答案 0 :(得分:35)

或缩短大卫的回答:

if 4 <= day <= 20 or 24 <= day <= 30:
    suffix = "th"
else:
    suffix = ["st", "nd", "rd"][day % 10 - 1]

答案 1 :(得分:29)

这是一个更通用的解决方案:

def ordinal(n):
    if 10 <= n % 100 < 20:
        return str(n) + 'th'
    else:
       return  str(n) + {1 : 'st', 2 : 'nd', 3 : 'rd'}.get(n % 10, "th")

答案 2 :(得分:12)

当您提出这个问题时,不确定它是否存在于5年前,但inflect包具有执行您正在寻找的功能的功能:

>>> import inflect
>>> p = inflect.engine()
>>> for i in range(1,32):
...     print p.ordinal(i)
...
1st
2nd
3rd
4th
5th
6th
7th
8th
9th
10th
11th
12th
13th
14th
15th
16th
17th
18th
19th
20th
21st
22nd
23rd
24th
25th
26th
27th
28th
29th
30th
31st

答案 3 :(得分:2)

这里使用字典作为函数或lambda ......

如果你向后看字典,你可以把它读成......

一切都以'th'结尾

...除非它以1,2或3结尾,否则以'st','nd'或'rd'结尾

......除非它以11,12或13结尾,否则它将以'th,'th'或'th'结束

# as a function
def ordinal(num):
    return '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th')))

# as a lambda
ordinal = lambda num : '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th')))

答案 4 :(得分:2)

更通用,更简洁的解决方案(作为一种功能):

def get_ordinal(num)
    ldig = num % 10
    l2dig = (num // 10) % 10

    if (l2dig == 1) or (ldig > 3):
        return '%d%s' % (num, 'th')
    else:
        return '%d%s' % (num, {1: 'st', 2: 'nd', 3: 'rd'}.get(ldig))

我只是结合了David的解决方案和库(正如deegeedubs所做的那样)。您甚至可以替换真实数学的变量(ldig,l2dig)(因为l2dig只使用一次),然后你得到四行代码。

答案 5 :(得分:2)

这些天我使用了箭头http://arrow.readthedocs.io/en/latest/(肯定不会出现在&#39; 09)

>>> import arrow
>>> from datetime import datetime
>>> arrow.get(datetime.utcnow()).format('Do')
'27th'

答案 6 :(得分:1)

除了第1,第2和第3,我认为他们都只是加上......第4,第5,第6,第11,第21 ......哦,哎呀; - )

我认为这可行:

def ordinal(num):
     ldig = num % 10
     l2dig = (num // 10) % 10
     if l2dig == 1:
         suffix = 'th'
     elif ldig == 1:
         suffix = 'st'
     elif ldig == 2:
         suffix = 'nd'
     elif ldig == 3:
         suffix = 'rd'
     else: 
         suffix = 'th'
     return '%d%s' % (num, suffix)

答案 7 :(得分:1)

def ordinal(n):
    return ["th", "st", "nd", "rd"][n%10 if n%10<4 and not (10<n%100<14) else 0]

答案 8 :(得分:1)

我做了一个似乎在这种情况下起作用的功能。只需传入一个日期对象,它将使用这一天来计算后缀。希望它有所帮助

from datetime import date
def get_day_ordinal(d):

    sDay = '%dth'
    if d.day <= 10 or d.day >= 21:
        sDay = '%dst' if d.day % 10 == 1 else sDay
        sDay = '%dnd' if d.day % 10 == 2 else sDay
        sDay = '%drd' if d.day % 10 == 3 else sDay

    return sDay % d.day

d = date.today()
print get_day_ordinal(d)

答案 9 :(得分:0)

这是一个更短的通用解决方案:

def foo(n):
    return str(n) + {1: 'st', 2: 'nd', 3: 'rd'}.get(4 if 10 <= n % 100 < 20 else n % 10, "th")

虽然上面的其他解决方案乍一看可能更容易理解,但使用少量代码时也可以这样做。

答案 10 :(得分:0)

修正了负输入,基于eric.frederich的漂亮sol'n(在使用abs时刚刚添加%):

def ordinal(num):
    return '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th'}.get(abs(num) % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(abs(num) % 10, 'th')))

答案 11 :(得分:0)

我必须从javascript转换脚本,其中我有一个有用的fn复制了phps date obj。非常相似

def ord(n):
    return str(n)+("th" if 4<=n%100<=20 else {1:"st",2:"nd",3:"rd"}.get(n%10, "th"))

这与我的日期样式器绑在一起:

def dtStylish(dt,f):
    return dt.strftime(f).replace("{th}", ord(dt.day))

ps-我来自另一个被报道为重复的线程,但这并不完全是因为该线程也解决了日期问题

答案 12 :(得分:0)

我想在我的项目中使用序数,在一些原型之后,我认为这种方法虽然不小,但对任何正整数都有效,是任何整数。

通过确定数字是高于还是低于20来起作用,如果数字低于20,则将int 1转换为字符串1,2,2; 3,3;其余的将添加“st”。

对于超过20的数字,它将取最后一位和倒数第二位,我分别称为十位和单位,并测试它们以查看要添加到该数字的内容。

顺便说一下,这是在python中,所以我不确定其他语言是否能够找到字符串中的最后一个或倒数第二个数字,如果它们应该很容易翻译。

def o(numb):
    if numb < 20: #determining suffix for < 20
        if numb == 1: 
            suffix = 'st'
        elif numb == 2:
            suffix = 'nd'
        elif numb == 3:
            suffix = 'rd'
        else:
            suffix = 'th'  
    else:   #determining suffix for > 20
        tens = str(numb)
        tens = tens[-2]
        unit = str(numb)
        unit = unit[-1]
        if tens == "1":
           suffix = "th"
        else:
            if unit == "1": 
                suffix = 'st'
            elif unit == "2":
                suffix = 'nd'
            elif unit == "3":
                suffix = 'rd'
            else:
                suffix = 'th'
    return str(numb)+ suffix

为了便于使用,我调用了函数“o”,可以通过import ordinal然后ordinal.o(number)导入我称之为“ordinal”的文件名来调用。

让我知道你的想法:D

P.S。我已经在另一个序数问题上发布了这个答案,但认识到这个问题更适用于考虑它的python。

答案 13 :(得分:0)

这是我写的一个函数,作为我编写的日历类型程序的一部分(我不包括整个程序)。它为任何大于0的数字添加了正确的序数。我包含了一个演示输出的循环。

def ordinals(num):
    # st, nums ending in '1' except '11'
    if num[-1] == '1' and num[-2:] != '11':
        return num + 'st'
    # nd, nums ending in '2' except '12'
    elif num[-1] == '2' and num[-2:] != '12':
        return num + 'nd'
    # rd, nums ending in '3' except '13'
    elif num[-1] == '3' and num[-2:] != '13':
        return num + 'rd'
    # th, all other nums
    else:
        return num + 'th'

data = ''

# print the first 366 ordinals (for leap year)
for i in range(1, 367):
    data += ordinals(str(i)) + '\n'

# print results to file
with open('ordinals.txt', 'w') as wf:
   wf.write(data)