【问题标题】:Timeseries as 2 numpy arrays ('Date' and 'Data') and then extracting 'Data' from a specified 'Date' range?时间序列为 2 个 numpy 数组(“日期”和“数据”),然后从指定的“日期”范围中提取“数据”?
【发布时间】:2016-11-16 06:25:45
【问题描述】:

我想问一下解决以下问题的最佳“日期”数据类型:

我正在从 ASCII 文件中读取时间序列数据并创建两个 numpy 数组; 1)date,2)data。创建后,我想从不同 ASCII 文件(start_timeduration 以秒为单位)指定的日期范围中提取 data。这些“数据”将被提取到另一个 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?

谢谢!

【问题讨论】:

    标签: python arrays datetime numpy time-series


    【解决方案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 函数,我们现在有了一个日期时间列,并且可以轻松地进行子集化:

    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
    

    【讨论】:

    • 太棒了!谢谢你。为了补充这一点,我使用了:b=pd.DataFrame._getitem_column(a, 'data') c=np.asarray(b, dtype='string') 将“数据”列作为 np 数组获取
    • 您可以执行 x.data.values - pandas 在内部将数据保存为 np.array,.values 将其取出。
    猜你喜欢
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2021-03-28
    相关资源
    最近更新 更多