我遇到了一个问题,即在我需要时有两个日期时间列。 我正在尝试使用以下
将数据加载到numpy数组中import numpy as np
import datetime
def load_data_from_file( filename):
timeconverter = lambda x: datetime.datetime.strptime(x, "%H:%M:%S.%f")
data = np.genfromtxt(filename,
delimiter=[' '],
dtype=['object','object','float',
'float','float','float'],
converters={1:timeconverter})
我的数据集文件如下所示:
2015/03/19 20:01:00.000 92.339302 0.694200 -0.013000 0.033000
我无法弄清楚如何结合" 2015/03/19"日期栏和" 20:01:00.000"时间列以形成日期时间列。我尝试使用空格分隔导入,但浮点数可能有负值,因此这个想法也不起作用。有任何想法吗?
答案 0 :(得分:3)
一种方法是预处理文本行,将前2个字符串按摩为np.datetime64
可以处理的表单:
def foo(s):
strings = s.split()
date, minutes = strings[:2]
date = date.replace('/','-')+'T'+minutes+'Z'
return ' '.join([date]+strings[2:])
txt=['2015-03-19T20:01:00.000Z 92.339302 0.694200 -0.013000 0.033000']
foo(txt[0])
# '2015-03-19T20:01:00.000 92.339302 0.694200 -0.013000 0.033000'
A=np.genfromtxt([foo(t) for t in txt],dtype='datetime64[ms],f,f,f,f')
制造
array((datetime.datetime(2015, 3, 19, 20, 1), 92.33930206298828, 0.6941999793052673, -0.013000000268220901, 0.032999999821186066),
dtype=[('f0', '<M8[ms]'), ('f1', '<f4'), ('f2', '<f4'), ('f3', '<f4'), ('f4', '<f4')])
np.datetime64
的时区假设可能令人困惑。我在Z
中添加了foo
以使UTC显式化。但显示仍然可以使用当地时间:
A['f0'][()]
# numpy.datetime64('2015-03-19T13:01:00.000-0700')
convertion of datetime to numpy datetime without timezone info
答案 1 :(得分:1)
如果你要使用pandas,这将是微不足道的加载:
In [4]:
import pandas as pd
import io
t="""2015/03/19 20:01:00.000 92.339302 0.694200 -0.013000 0.033000"""
df = pd.read_csv(io.StringIO(t), sep='\s+',parse_dates=[[0,1]], header=None)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1 entries, 0 to 0
Data columns (total 5 columns):
0_1 1 non-null datetime64[ns]
2 1 non-null float64
3 1 non-null float64
4 1 non-null float64
5 1 non-null float64
dtypes: datetime64[ns](1), float64(4)
memory usage: 48.0 bytes
In [5]:
df
Out[5]:
0_1 2 3 4 5
0 2015-03-19 20:01:00 92.339302 0.6942 -0.013 0.033