Numpy genfromtxt问题与datetime有多列

时间:2015-04-16 17:54:55

标签: python datetime numpy

我遇到了一个问题,即在我需要时有两个日期时间列。 我正在尝试使用以下

将数据加载到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"时间列以形成日期时间列。我尝试使用空格分隔导入,但浮点数可能有负值,因此这个想法也不起作用。有任何想法吗?

2 个答案:

答案 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