dateutil.parser.parse() 解析距离字符串?

2 投票
3 回答
550 浏览
提问于 2025-04-16 05:33

有没有人知道一个Python的库,能像dateutil处理日期那样处理距离字符串?如果有一个这样的工具就太好了,能像下面这样工作:

>>> from awesome_dist_module import Distance
>>> d = Distance("100 ft")
>>> d.meters
30.48
>>> d = Distance("100 feet")
>>> d.meters
30.48
>>> d.miles
0.0189393939

这里最重要的不是转换本身,而是能够输入一个表示某种测量的字符串,然后得到一个浮点数,表示你选择的另一种测量,而不需要知道字符串里具体是什么测量。

有没有这样的东西呢?

3 个回答

1

以下这些模块有没有符合你的需求呢?

units

>>> from units import unit
>>> metre = unit('m')
>>> second = unit('s')
>>> print(metre(10) / second(2))
5 m / s
>>> print(metre(10) ** 3)
1000 m * m * m

magnitude

>>> from magnitude import mg
>>> print mg(10, 'm/s') ** 2
100.0000 m2 / s2 
>>> print (mg(10, 'm') * 2 / (10, 'm/s2')).sqrt()
1.4142 s 
>>> tsq = mg(10, 'm') * 2 / (10, 'm/s2')
>>> print tsq ** 0.5
1.4142 s
>>> print mg(1, "lightyear") / mg(1, "c")
>>> 31557600.0000 s
>>> y = mg(1, "lightyear") / (1, "c") 
>>> print y.ounit("year")
1.0000 year
>>> print y.ounit('day')
>>> print yd
365.2500 day
>>> power = mg(100, 'kg') * (2, 'gravity') * (5, 'km/h')
>>> print power
2724.0694 m2 kg / s3 
>>> print power.ounit('mW')
2724069.4444 mW
>>> print power.ounit('kW')
2.7241 kW

Unum(文档在源代码里)

quantities文档

2

如果你知道自己需要哪些单位(而不需要查找成百上千种不同的单位),那么你可以很简单地自己实现这个功能。下面是一个例子:

class Distance():

    METER   = 1
    FOOT    = 0.3048

    UNITS = { "feet" : FOOT,
              "ft"   : FOOT,
              "foot" : FOOT,
              "meters" : METER,
              "mts"    : METER,
              "meter"  : METER,
              "mt"     : METER }

    def __init__(self, string):

        number, unit = string.split()
        number = long(number)

        self.value = number * Distance.UNITS[unit]

if __name__ == "__main__":
    d = Distance("1500 ft")
    print d.value

这段代码会帮你处理字符串的读取。之后你就可以使用任何单位转换的库了。

3

我为你写了这个,不过你可以根据自己的需要进行扩展:

class Distance(object):

    METER = 1
    FOOT = 0.3048
    MILE = 1609.344
    INCH = 0.0254
    UNITS = {'meters': METER,
         'mts': METER,
         'mt': METER,
         'feet': FOOT,
         'foot': FOOT,
         'ft': FOOT,
         'miles': MILE,
         'mls': MILE,
         'ml': MILE,
         'inch': INCH,
         }
    def __init__(self, s):
        self.number, unit = s.split()
        self._convert(unit)

    def _convert(self, unit):
        self.number = float(self.number)
        if self.UNITS[unit] != 1:
            self.number *= self.UNITS[unit]

    @ property
    def meters(self):
        return self.number

    @ meters.setter
    def meters(self, v):
        self.number = float(v)

    @ property
    def miles(self):
        return self.number / self.MILE

    @ miles.setter
    def miles(self, v):
        self.number = v
        self._convert('miles')

    @ property
    def feet(self):
        return self.number / self.FOOT

    @ feet.setter
    def feet(self, v):
        self.number = v
        self._convert('feet')

    @ property
    def inch(self):
        return self.number / self.INCH

    @ inch.setter
    def inch(self, v):
        self.number = v
        self._convert('inch')

这里有一些例子:

>>> d = Distance('1302.09029321 mts')
>>> d.meters
1302.09029321
>>> d.feet
4271.949780872703
>>> d.inch
51263.39737047244
>>> d.miles
0.8090813978925575
>>> d.miles = 1
>>> d.meters
1609.344
>>> d.feet
5280.0
>>> d.inch = .0002
>>> d.inch
0.00019999999999999998
>>> d.feet
1.6666666666666664e-05
>>> d.meters
5.08e-06
>>> d.miles
3.156565656565656e-09
>>> d.feet = 1
>>> d.meters
0.3048
>>> d.miles
0.0001893939393939394

编辑:添加了设置器

撰写回答