我有几个包含数千条记录的数据文件:
4844,05/24/18 07:30:00 AM,75.312,0.428
4845,05/24/18 07:40:00 AM,75.312,0.435
4846,05/24/18 07:50:00 AM,75.312,0.429
我试图使用numpy.genfromtxt()
将其拉入NumPy,如下所示:
data = np.genfromtxt(file_name, dtype=[('recordId','i8')
, ('trn_date','datetime64[s]'), ('temperature','f8'), ('depth','f8')]
, delimiter=',', skip_header=2)
不幸的是,我无法弄清楚trn_date字段的正确dtype格式元组,以便正确解析这些日期时间字符串,因为它们使用AM / PM后缀而不是处于"军事时间"。
任何帮助将不胜感激。我试过RTFM ......
答案 0 :(得分:2)
由于NumPy日期时间解析超出ISO 8601格式的datetime.datetime.strptime
,您可能需要为converters=
参数的日期传入一个利用isn't super flexible的自定义转换器。
如果您查看strptime
的{{3}},可以看到它可以使用%p
指令处理AM / PM。
import datetime as dt
def date_parser(d_bytes):
s = d_bytes.decode('utf-8')
return np.datetime64(dt.datetime.strptime(s, '%m/%d/%y %I:%M:%S %p'))
data = np.genfromtxt(
# ...
converters={1: date_parser})
答案 1 :(得分:0)
麻烦在于numpy.getfromtxt()解析日期时间的格式为:'YYYY-MM-DDT00:00:00' 例如'2018-05-27T01:45:45' See the docs
解决方案是将文本重新写入此格式。有很多方法可以做到这一点,比如制作一个新文件,或者使用StringIO。
以下是清理文本并将其写入新文件的示例:
with open(input_text, 'r') as file_io:
for line in file_io:
split_line = line.split(',')
split_datetime = split_line[1].split(' ')
print(split_datetime)
split_date = split_datetime[0].split('/')
print(split_date)
#put the date back in
fixed_datetime = '20' + split_date[2] \
+ '-' + split_date[0] \
+ '-' + split_date[1] \
+ 'T' + split_datetime[1]
prepared_text = prepared_text + split_line[0] + ',' \
+ fixed_datetime[1] + ',' \
+ split_line[2] + ',' \
+ split_line[3]
secondary_file = 'secondary_data_file.txt'
with open(secondary_file, 'w') as sec_file_io:
sec_file_io.write(prepared_text)
你可以用不同的方式做到这一点。你dtype是对的!