【问题标题】:How to convert an ndarray of integers to strings and add leading 0 to elements < 10如何将整数的ndarray转换为字符串并将前导0添加到元素<10
【发布时间】:2017-10-10 18:22:02
【问题描述】:

我正在尝试将一天中的秒数数组(自午夜以来的秒数)转换为 hh:mm:ss。看起来 datetime 和 pandas 没有办法做到这一点,所以我正在编写一个函数来手动完成,以便我可以构造一个 ISO 日期/时间字符串以传递给 pandas。

sod = np.arange(0, 86399)
hours = sod // 3600
L = list(np.list(np.array(hours, str))

这就是我尝试的任何方法都不起作用的地方......我想做的就像我在 IDL 中所做的那样:

smallHourIndices = where(L < 10)
L[smallHourIndices] = '0' + L[smallHourIndices]

【问题讨论】:

    标签: python arrays string


    【解决方案1】:

    您可以使用np.core.defchararray.zfill 函数为数组的项目添加零前缀,但由于它只接受字符串类型的对象,您可以先使用预期的掩码找到相应的项目,然后传递字符串版本并连接结果与您的阵列的其余部分。

    In [22]: mask = hours < 10
    
    In [23]: np.concatenate((np.core.defchararray.zfill(hours[mask].astype(str), 2), hours[~mask]))
    Out[23]: 
    array(['00', '00', '00', ..., '23', '23', '23'], 
          dtype='<U21')
    

    【讨论】:

    • 这行得通!我希望命令不需要那么长。另外,如果数字在原始列表中不是连续的,这看起来也行不通,对吗?
    • @JamesPMason 用更短的行编写它很容易,但在这种情况下,它会超过 1 行。关于在其他情况下工作而不是顺序数组,它肯定有效,因为掩码与项目的顺序无关。
    • 但是concatenate不会导致最终结果是elements_in_mask,elements_out_of_mask的顺序吗?例如,小时 = [0, 12, 3], 结果 -> ['00', '03', '12']
    • 显然,在这种情况下,您可以简单地从主数组创建一个字符串数组,并将与掩码匹配的项目替换为 np.core.defchararray.zfill 的结果。
    • @JamesPMason 喜欢这个str_array[mask] = np.core.defchararray.zfill(hours[mask].astype(str), 2)
    【解决方案2】:

    如果我正确理解了您的问题,您希望在 L 中添加尾随零,因此这是一个人性化的小时。您可以使用zfill,这是字符串具有的一种方法:

    L = 3
    firendly_hour = str(L).zfill(2)
    print(firendly_hour)  # outputs '03'
    
    L = 11
    firendly_hour = str(L).zfill(2)
    print(firendly_hour)  # outputs '11'
    

    【讨论】:

    • 我喜欢这样简洁,但我也在尝试保留数组,这种方法会导致: In [120]:friendly_hour = str(L).zfill(2) In [121 ]:friendly_hour[0] Out[121]: '['
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2015-08-02
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多