在Python

时间:2015-10-08 00:19:37

标签: python unicode

我们的一些客户提交的时间戳如2015-10-03 19:01:43 谷歌翻译为“03/10/2015 19:01:43”。链接here

我如何在Python中实现相同的目标?

4 个答案:

答案 0 :(得分:2)

我的解决方案因其他时间戳而​​失败:u'2015-10-18 08:22:11'。转到J.F. Sebastianjimhark的解决方案。

使用ord获取unicode代码点。数字从1632(0)开始。

d = u'٢٠١٥-١٠-٠٣ ١٩:٠١:٤٣'

s = []
for c in d:
    o = ord(c)
    print '%s -> %s, %s - 1632 = %s' %(c, o, o, o - 1632)
    if 1631 < o < 1642:
        s.append(str(o - 1632))
        continue
    s.append(c)   
print ''.join(s)

#or as a one liner:
print ''.join([str(ord(c)-1632) if 1631 < ord(c) < 1642 else c for c in d])

这是for循环的输出:

٢ -> 1634, 1634 - 1632 = 2
٠ -> 1632, 1632 - 1632 = 0
١ -> 1633, 1633 - 1632 = 1
٥ -> 1637, 1637 - 1632 = 5
- -> 45, 45 - 1632 = -1587
١ -> 1633, 1633 - 1632 = 1
٠ -> 1632, 1632 - 1632 = 0
- -> 45, 45 - 1632 = -1587
٠ -> 1632, 1632 - 1632 = 0
٣ -> 1635, 1635 - 1632 = 3
  -> 32, 32 - 1632 = -1600
١ -> 1633, 1633 - 1632 = 1
٩ -> 1641, 1641 - 1632 = 9
: -> 58, 58 - 1632 = -1574
٠ -> 1632, 1632 - 1632 = 0
١ -> 1633, 1633 - 1632 = 1
: -> 58, 58 - 1632 = -1574
٤ -> 1636, 1636 - 1632 = 4
٣ -> 1635, 1635 - 1632 = 3
2015-10-03 19:01:43

答案 1 :(得分:2)

将时间字符串转换为日期时间对象(Python 3):

>>> import re
>>> from datetime import datetime
>>> datetime(*map(int, re.findall(r'\d+', ' ٢٠١٥-١٠-٠٣ ١٩:٠١:٤٣')))
datetime.datetime(2015, 10, 3, 19, 1, 43)
>>> str(_)
'2015-10-03 19:01:43'

如果您只需要数字:

>>> list(map(int, re.findall(r'\d+', ' ٢٠١٥-١٠-٠٣ ١٩:٠١:٤٣')))
[2015, 10, 3, 19, 1, 43]

答案 2 :(得分:2)

虽然受到其他一些答案的启发(感谢@kev),我采取了不同的方法。

(Doh!我刚注意到@kev也问了这个问题。)

你特意询问了阿拉伯字符,但它简化了处理所有Unicode数字的事情。

注意:我处理相同的日期字符串,但使用Unicode转义序列指定Unicode字符,因为这在我的系统上更容易。

import unicodedata

unicodeDate = u'\u0662\u0660\u0661\u0665-\u0661\u0660-\u0660\u0663 \u0661\u0669:\u0660\u0661:\u0664\u0663'

converted = u''.join([unicode(unicodedata.decimal(c, c)) for c in unicodeDate])
print converted

如果第一个参数没有映射到Unicode小数,则unicodedata.decimal的第二个参数是要返回的默认值。为两个参数传递相同字符的效果是任何Unicode十进制转换为等效的ASCII十进制,并且所有其他字符都不会更改。

我的原始答案

converted = ''.join([str(unicodedata.digit(c, c)) for c in unicodeDate])

@ J.F。塞巴斯蒂安提供了一个有用的评论,指出上面的代码没有正确处理超级脚本,例如u'\u00b2'。同一组中还有上标:'\u00b3'u'\u00b9'。我发现这也影响了一些代码点:

显然unicodedata.digit()试图从装饰的数字中抽出一个数字,这在这里可能并不合适。但unicodedata.decimal似乎完全符合所需(假设您不想转换装饰数字)。

答案 3 :(得分:1)

还有来自https://pypi.python.org/pypi/Unidecodeunidecode库。

在Python 2中:

>>> from unidecode import unidecode
>>> unidecode(u"۰۱۲۳۴۵۶۷۸۹")
'0123456789'

在Python 3中:

>>> from unidecode import unidecode
>>> unidecode("۰۱۲۳۴۵۶۷۸۹")
'0123456789'