时间序列STM的数据清理和准备

2024-03-28 23:12:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要准备数据,将其输入LSTM,以便预测第二天的情况。 我的数据集是以秒为单位的时间序列,但我每天只有3-5个小时的数据。(我只有这个特定的数据集,所以无法更改) 我有Date-Time和某个Value。 E、 g.:

datetime..............Value      
2015-03-15 12:00:00...1000

2015-03-15 12:00:01....10

.

.

我想写一个代码,我提取,例如4小时,删除提取的第一个小时,只是为特定的月份(因为这个数据是错误的)。 我成功地编写了一个代码来提取x-Data(输入)和y-Data(输出)的数据,例如2小时。 我希望我能向你解释我的问题。你知道吗

数据集是以秒为单位的1年数据,缺少下午6点到11点的休息时间。 例如,8月至11月的第一个小时是错误数据,需要删除。你知道吗

init = True
for day in np.unique(x_df.index.date):
    temp = x_df.loc[(day + pd.DateOffset(hours=18)):(day + pd.DateOffset(hours=20))]

if len(temp) == 7201:
if init:
    x_df1 = np.array([temp.values])
    init = False
else:
    #print (temp.values.shape)
    x_df1 = np.append(x_df1, np.array([temp.values]), axis=0)
#else:
#if not temp.empty:
    #print (temp.index[0].date(), len(temp))

x_df1 = np.array(x_df1)

print('X-Shape:', x_df1.shape, 
'Y-Shape:', y_df1.shape)
#sample, timesteps and features for LSTM
X-Shape: (32, 7201, 6) Y-Shape: (32, 7201)

我的预期结果是有一个数据集,例如每天4小时,其中删除了8月、9月和10月的第一个小时。 如果有人能为我提供更好的代码,我也会非常高兴。你知道吗


Tags: 数据代码ifinitnparraytempdf1
1条回答
网友
1楼 · 发布于 2024-03-28 23:12:03

也许不是最有效的解决方案,但也许它仍然适用。你知道吗

首先,让我们为前4个月和每月5天生成一些随机数据:

import random
import pandas as pd

df = pd.DataFrame()
for month in range(1,5): #First 4 Months
    for day in range(5,10): #5 Days
        hour = random.randint(18,19)
        minute = random.randint(1,59)
        dt = datetime.datetime(2018,month,day,hour,minute,0)
        dti = pd.date_range(dt, periods=60*60*4, freq='S')
        values = [random.randrange(1, 101, 1) for _ in range(len(dti))]
        df = df.append(pd.DataFrame(values, index=dti, columns=['Value']))

现在让我们定义一个函数来过滤每天的第一行:

def first_value_per_day(df):
    res_df = df.groupby(df.index.date).apply(lambda x: x.iloc[[0]])
    res_df.index = res_df.index.droplevel(0)
    return res_df

并打印结果:

print(first_value_per_day(df))

                     Value
2018-01-05 18:31:00     85
2018-01-06 18:25:00     40
2018-01-07 19:54:00     52
2018-01-08 18:23:00     46
2018-01-09 18:08:00     51
2018-02-05 18:58:00      6
2018-02-06 19:12:00     16
2018-02-07 18:18:00     10
2018-02-08 18:32:00     50
2018-02-09 18:38:00     69
2018-03-05 19:54:00    100
2018-03-06 18:37:00     70
2018-03-07 18:58:00     26
2018-03-08 18:28:00     30
2018-03-09 18:34:00     71
2018-04-05 18:54:00      2
2018-04-06 19:16:00    100
2018-04-07 18:52:00     85
2018-04-08 19:08:00     66
2018-04-09 18:11:00     22

所以,现在我们需要一个具体月份的列表,在这里是2和3。现在,我们使用定义的函数,过滤每个选定的月的天数,并循环这些天数,找到每天+1小时后第一个条目中所有值的索引,然后将其删除:

MONTHS_TO_MODIFY = [2,3]
HOURS_TO_DROP = 1

fvpd = first_value_per_day(df)
for m in MONTHS_TO_MODIFY:
    fvpdm = fvpd[fvpd.index.month == m]
    for idx, value in fvpdm.iterrows():
        start_dt = idx
        end_dt = idx + datetime.timedelta(hours=HOURS_TO_DROP)
        index_list = df[(df.index >= start_dt) & (df.index < end_dt)].index.tolist()
        df.drop(index_list, inplace=True)

结果:

print(first_value_per_day(df))

                     Value
2018-01-05 18:31:00     85
2018-01-06 18:25:00     40
2018-01-07 19:54:00     52
2018-01-08 18:23:00     46
2018-01-09 18:08:00     51
2018-02-05 19:58:00      1
2018-02-06 20:12:00     42
2018-02-07 19:18:00     34
2018-02-08 19:32:00     34
2018-02-09 19:38:00     61
2018-03-05 20:54:00     15
2018-03-06 19:37:00     88
2018-03-07 19:58:00     36
2018-03-08 19:28:00     38
2018-03-09 19:34:00     42
2018-04-05 18:54:00      2
2018-04-06 19:16:00    100
2018-04-07 18:52:00     85
2018-04-08 19:08:00     66
2018-04-09 18:11:00     22

相关问题 更多 >