这个答案如下您率先采用loadtxt
,并希望解释你得到了什么,以及替代品。但是如果你没有进行任何计算,只需读取每一行,分割它,然后将其写回所需的格式可能会更简单。一个csv
读者可能会使这个任务更简单,但不是必需的。简单的Python行读取和写入,并且字符串操作将起作用。
============
使用您的样品的字符串复制(在PY3字节字符串):
In [296]: txt=b"""name, lat, lon, alt, time
...: id1, 40.436047, -74.814883, 33000, 2016-01-21T08:08:00Z
...: id2, 40.436047, -74.814883, 33000, 2016-01-21T08:08:00Z""".splitlines(
...:)
In [297]: txt
Out[297]:
[b'name, lat, lon, alt, time',
b'id1, 40.436047, -74.814883, 33000, 2016-01-21T08:08:00Z',
b'id2, 40.436047, -74.814883, 33000, 2016-01-21T08:08:00Z']
In [298]: data=np.loadtxt(txt,delimiter=',',dtype=np.string_,skiprows=1)
In [299]: data
Out[299]:
array([[b'id1', b' 40.436047', b' -74.814883', b' 33000',
b' 2016-01-21T08:08:00Z'],
[b'id2', b' 40.436047', b' -74.814883', b' 33000',
b' 2016-01-21T08:08:00Z']],
dtype='|S21')
In [300]: data[:,4]
Out[300]:
array([b' 2016-01-21T08:08:00Z', b' 2016-01-21T08:08:00Z'],
dtype='|S21')
或者与解压
In [302]: name,lat,lon,alt,time=np.loadtxt(txt,delimiter=',',dtype=np.string_,sk
...: iprows=1,unpack=True)
In [303]: time
Out[303]:
array([b' 2016-01-21T08:08:00Z', b' 2016-01-21T08:08:00Z'],
dtype='|S21')
我们已经将该文件作为2d字符串数组或5个1d数组加载。 time
是一串字符串。
我这个字符串数组转换成DATATIME对象的数组:
In [307]: time1 = time.astype(np.datetime64)
In [308]: time1
Out[308]: array(['2016-01-21T08:08:00', '2016-01-21T08:08:00'], dtype='datetime64[s]')
In [309]: time1[0]
Out[309]: numpy.datetime64('2016-01-21T08:08:00')
我甚至可以用日期时间直接加载它。但是这并不能解决你的显示问题。
=====================
genfromtxt
赋予更多的权力来加载不同列类型
In [312]: np.genfromtxt(txt,dtype=None,skip_header=1,delimiter=',')
Out[312]:
array([(b'id1', 40.436047, -74.814883, 33000, b' 2016-01-21T08:08:00Z'),
(b'id2', 40.436047, -74.814883, 33000, b' 2016-01-21T08:08:00Z')],
dtype=[('f0', 'S3'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<i4'), ('f4', 'S21')])
这给的混合字符串,浮动和int。日期仍然是字符串。
如果我有一个具体的D型更换dtype=None
,我可以为日期前:
In [313]: dt=['S3','f','f','i','datetime64[s]']
In [315]: data=np.genfromtxt(txt,dtype=dt,skip_header=1,delimiter=',')
In [316]: data
Out[316]:
array([ (b'id1', 40.4360466003418, -74.81488037109375, 33000, datetime.datetime(2016, 1, 21, 8, 8)),
(b'id2', 40.4360466003418, -74.81488037109375, 33000, datetime.datetime(2016, 1, 21, 8, 8))],
dtype=[('f0', 'S3'), ('f1', '<f4'), ('f2', '<f4'), ('f3', '<i4'), ('f4', '<M8[s]')])
In [317]: data['f4']
Out[317]: array(['2016-01-21T08:08:00', '2016-01-21T08:08:00'], dtype='datetime64[s]')
===============
第一切口在将其写回档案
In [318]: np.savetxt('test.txt',data,fmt='%4s, %.5f, %.5f, %d, %s')
In [320]: cat test.txt
b'id1', 40.43605, -74.81488, 33000, 2016-01-21T08:08:00
b'id2', 40.43605, -74.81488, 33000, 2016-01-21T08:08:00
控制浮点精度很明显。我需要修复第一个字节的字符串显示。它不会分割日期 - 我只是显示正常的字符串表示。
=================
您可以将np.datetime64
阵列转换为datetime
对象的数组:
In [361]: from datetime import datetime
In [362]: data['f4'].astype(datetime)
Out[362]:
array([datetime.datetime(2016, 1, 21, 8, 8),
datetime.datetime(2016, 1, 21, 8, 8)], dtype=object)
我可以转换成该一个字符串数组具有逗号分隔符:
In [383]: tfmt='%Y, %m, %d, %H, %M, %S'
In [384]: timefld=data['f4'].astype(datetime)
In [385]: timefld = np.array([d.strftime(tfmt) for d in timefld])
In [386]: timefld
Out[386]:
array(['2016, 01, 21, 08, 08, 00', '2016, 01, 21, 08, 08, 00'],
dtype='<U24')
=========================
纯文本编辑途径可以使用的功能,如
def foo(dtstr):
return dtstr.replace(b'-',b', ').replace(b':',b', ').replace(b'T',b', ').replace(b'Z',b'')
def foo(dtstr):
# cleaner version with re
import re
return re.sub(b'[-:T]',b', ',dtstr[:-1])
def editline(aline):
aline=aline.split(b',')
aline[4]=foo(aline[4])
return b', '.join(aline)
In [408]: [editline(aline) for aline in txt[1:]]
Out[408]:
[b'id1, 40.436047, -74.814883, 33000, 2016, 01, 21, 08, 08, 00',
b'id2, 40.436047, -74.814883, 33000, 2016, 01, 21, 08, 08, 00']
使用'datetime.strptime'解析出日期时间,不要分割它 –
您是否试图将这些数据加载到一个或多个'numpy'数组中进行计算,或者您只是想重新格式化文件 - 也就是说,只需使用新格式将相同的数据写回文件?你不需要numpy来编辑文件。 – hpaulj