为了账号安全,请及时绑定邮箱和手机立即绑定

替换 Numpy 字符串列表中的单个字符

替换 Numpy 字符串列表中的单个字符

慕运维8079593 2022-06-14 15:11:35
我有一个 datetime64 对象的 Numpy 数组,我需要将其转换为特定的时间格式 yyyy-mm-dd,HH:MM:SS.SSS Numpy 有一个名为datetime_as_string输出 ISO8601 (yyyy-mm-ddTHH:MM:SS. SSS)时间,这与我想要的非常接近,唯一的区别是有一个 T 我想要一个逗号。有没有办法快速将“T”换成“,”?这是一个示例数据集:offset = np.arange(0, 1000)epoch = np.datetime64('1970-01-01T00:00:00.000')time_objects = epoch + offset.astype('timedelta64[ms]')time_strings = np.datetime_as_string(time_objects)我已经成功使用了 lambda 和列表推导,但是从 Python 列表到 Numpy 数组来回切换似乎很尴尬。f = lambda x: x[:10] + ',' + x[11:]np.array([f(x) for x in time_strings])我知道在某些情况下 lambdas 可以“直接”应用于 Numpy 数组,但在这种情况下它不起作用。f(time_strings)产生一个类型错误。有什么想法吗?我知道我可以转换回 Python 日期时间(这是我来自的方向)或使用 Pandas。但是这个datetime_as_string功能真的很快,我想坚持使用 Numpy 解决方案。--- 基于答案的结论 ---事实证明,Paul 的观点施展黑魔法比我的列表理解快 75 倍,比np.char.replace(). 以下是这三种方法的结果(均使用上述数据集进行初始化,但包含 1000000 个元素)。start = time.time()time_strings[..., None].view('U1')[..., 10] = ','print(time.time() - start)0.016000747680664062 secondsstart = time.time()f = lambda x: x[:10] + ',' + x[11:]time_strings = np.array([f(x) for x in time_strings])print(time.time() - start, 'seconds')1.1740672588348389 secondsstart = time.time()time_strings = np.char.replace(time_strings,'T',',')print(time.time() - start, 'seconds')1.4980854988098145 seconds
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您可以使用 viewcasting 来访问单个字符:

time_strings[...,None].view('U1')[...,10] = ','

time_strings就地改变。


查看完整回答
反对 回复 2022-06-14
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

In [309]: np.char.replace(time_strings,'T',',')                                 

Out[309]: 

array(['1970-01-01,00:00:00.000', '1970-01-01,00:00:00.001',

       '1970-01-01,00:00:00.002', '1970-01-01,00:00:00.003',

       '1970-01-01,00:00:00.004', '1970-01-01,00:00:00.005',

       '1970-01-01,00:00:00.006', '1970-01-01,00:00:00.007',

       ....

但是@PaulPanzer 的就地速度要快得多(即使它有点晦涩难懂):


In [316]: %%timeit temp=time_strings.copy() 

     ...: temp[...,None].view('U1')[...,10] = ','                                                                      

8.48 µs ± 34.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [317]: timeit np.char.replace(time_strings,'T',',')                          

1.23 ms ± 1.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信