【问题标题】:Parsing a data matrix containing HH:MM:SS.mmm times using numpy.loadtxt使用 numpy.loadtxt 解析包含 HH:MM:SS.mmm 次的数据矩阵
【发布时间】:2014-06-22 08:02:59
【问题描述】:

我知道我可以做类似的事情

numpy.loadtxt('data.txt', dtype={'names': ('time', 'magnitude'),
                                 'formats': ('S12', 'f8')})

但这给了我时间作为一个字符串。我怎样才能将它操纵成一个浮点数?

【问题讨论】:

    标签: python parsing numpy time


    【解决方案1】:

    您可以使用converter parameter 将函数应用于第一列中的每个字符串。为每一行调用一次 Python 函数可能会大大降低 np.loadtxt 的速度,但这对于中等大小的文件可能仍然是一个可行的解决方案:

    import numpy as np
    
    def parse_date(datestr):
        return sum([multiplier*val for multiplier, val in
                    zip((3600, 60, 1), map(float, datestr.split(':')))])
    
    
    x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'), 'formats': ('f8', 'f8')},
                   converters={0:parse_date})
    print(x)
    

    或者,您可以在使用 loadtxt 后将字符串解析为浮点数,如下所示:

    x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'), 'formats': ('S12', 'f8')})
    arr = np.char.split(x['time'], ':')
    # http://stackoverflow.com/a/19459439/190597 (Jaime)
    newarr = np.fromiter((tuple(row) for row in arr), dtype=[('', np.float)]*3,
                         count=len(arr)).view('float').reshape(-1, 3)
    times = (newarr * [3600,60,1]).sum(axis=1)
    
    y = np.empty_like(x, dtype={'names': ('time', 'magnitude'), 'formats': ('f8', 'f8')})
    y['time'] = times
    y['magnitude'] = x['magnitude']
    print(y)
    

    编辑:我创建了一个 10**6 行的测试文件来测试哪种方法更快。第二种方法快一点:

    In [329]: %timeit using_fromiter()
    1 loops, best of 3: 5.59 s per loop
    
    
    In [328]: %timeit using_converter()
    1 loops, best of 3: 6.88 s per loop
    

    import os
    import numpy as np
    
    def create_data(N):
        data = np.random.random(size=N)*86400
        hours, remainder = data.__divmod__(3600)
        minutes, seconds = remainder.__divmod__(60)
        mag = np.arange(N)
        filename = os.path.expanduser('~/tmp/data')
        with open(filename, 'w') as f:
            for h,m,s,a in np.column_stack([hours, minutes, seconds, mag]):
                f.write('{h:d}:{m:d}:{s:.6f} {a}\n'.format(h=int(h), m=int(m), s=s, a=a))
    
    def parse_date(datestr):
        return sum([multiplier*val for multiplier, val in
                    zip((3600, 60, 1), map(float, datestr.split(':')))])
    
    def using_converter():
        x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'),
                                      'formats': ('f8', 'f8')},
                       converters={0:parse_date})
        return x
    
    def using_fromiter():
        x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'), 'formats': ('S12', 'f8')})
        arr = np.char.split(x['time'], ':')
        newarr = np.fromiter((tuple(row) for row in arr), dtype=[('', np.float)]*3,
                             count=len(arr)).view('float').reshape(-1, 3)
        times = (newarr * [3600,60,1]).sum(axis=1)
    
        y = np.empty_like(x, dtype={'names': ('time', 'magnitude'), 'formats': ('f8', 'f8')})
        y['time'] = times
        y['magnitude'] = x['magnitude']
        return y
    
    create_data(10**6)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多