我们的一些客户提交的时间戳如2015-10-03 19:01:43 谷歌翻译为“03/10/2015 19:01:43”。链接here。
我如何在Python中实现相同的目标?
答案 0 :(得分:2)
我的解决方案因其他时间戳而失败:u'2015-10-18 08:22:11'。转到J.F. Sebastian或jimhark的解决方案。
使用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/Unidecode的unidecode
库。
在Python 2中:
>>> from unidecode import unidecode
>>> unidecode(u"۰۱۲۳۴۵۶۷۸۹")
'0123456789'
在Python 3中:
>>> from unidecode import unidecode
>>> unidecode("۰۱۲۳۴۵۶۷۸۹")
'0123456789'