时间序列为2个numpy数组('Date'和'Data'),然后从指定的'Date'范围中提取'Data'?

时间:2016-07-13 15:09:49

标签: python arrays datetime numpy time-series

我想问一下最好的'Date'数据类型用于以下问题:

我正在从ASCII文件中读取时间序列数据并创建两个numpy数组; 1)date,2)data。创建之后,我想从一个不同的ASCII文件(datastart_time指定的日期范围中提取duration,以秒为单位)。这些“数据”将被提取到另一个numpy数组中并写入输出文件。

到目前为止,我有:

import numpy as np

    date = ['2016-07-05  12:00:00.000000',
            '2016-07-05  12:00:00.010000',
            '2016-07-05  12:00:00.020000',
            '2016-07-05  12:00:00.030000',
            '2016-07-05  12:00:00.040000',
            '2016-07-05  12:00:00.050000',
            '2016-07-05  12:00:00.060000',
            '2016-07-05  12:00:00.070000',
            '2016-07-05  12:00:00.080000',
            '2016-07-05  12:00:00.090000',
            '2016-07-05  12:00:00.100000',
            '2016-07-05  12:00:00.110000',
            '2016-07-05  12:00:00.120000',
            '2016-07-05  12:00:00.130000',
            '2016-07-05  12:00:00.140000']        
data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]

date = np.asarray(date, dtype=np.string_)
data = np.asarray(data, dtype=np.float32)

然后,为了从所需的日期范围中提取,我有:

start_time = '2016-07-05  12:00:00.030000'
duration = 0.10 
a=[]
a=data[(date >= (start_time) & (date <= (start_time + duration))]

然后将'a'转换为数组以写入另一个文件:

a=np.asarray(a, dtype='float32')

但是 - 我为date尝试的每种dtype或datetime类都给了我一些错误(例如,对象没有属性 _getitem_等,)或与列表不兼容。在这种情况下你会使用什么格式? POSIX?

谢谢!

1 个答案:

答案 0 :(得分:1)

我会为此使用熊猫。对时间序列的东西有很好的支持,see the docs。您可能希望使用时间序列索引来进行更详细的工作,这里我将其用作普通列。

注意,您的数据和日期有不同的行数,我在数据中添加了0:

import pandas as pd

date = ['2016-07-05  12:00:00.000000',
            '2016-07-05  12:00:00.010000',
            '2016-07-05  12:00:00.020000',
            '2016-07-05  12:00:00.030000',
            '2016-07-05  12:00:00.040000',
            '2016-07-05  12:00:00.050000',
            '2016-07-05  12:00:00.060000',
            '2016-07-05  12:00:00.070000',
            '2016-07-05  12:00:00.080000',
            '2016-07-05  12:00:00.090000',
            '2016-07-05  12:00:00.100000',
            '2016-07-05  12:00:00.110000',
            '2016-07-05  12:00:00.120000',
            '2016-07-05  12:00:00.130000',
            '2016-07-05  12:00:00.140000']
data = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]

x = pd.DataFrame({'date':date, 'data':data})
x.date = pd.to_datetime(x.date)

我们现在有一个包含两列的pandas数据框,您的日期时间格式和数据。

使用to_datetime函数,我们现在有一个datetime列,可以轻松地进行子集化:

start_time = pd.to_datetime('2016-07-05  12:00:00.030000')
end_time = start_time + pd.DateOffset(seconds = 0.10) #or minutes etc etc

x[(x.date < end_time) & (x.date > start_time)]

,并提供:

    data    date
4   4   2016-07-05 12:00:00.040
5   5   2016-07-05 12:00:00.050
6   6   2016-07-05 12:00:00.060
7   7   2016-07-05 12:00:00.070
8   8   2016-07-05 12:00:00.080
9   9   2016-07-05 12:00:00.090
10  10  2016-07-05 12:00:00.100
11  11  2016-07-05 12:00:00.110
12  12  2016-07-05 12:00:00.120