首页 > 解决方案 > 如何使用熊猫python使用csv文件编写代码以每60分钟显示一次输出值

问题描述

我在 csv 文件中有温度。我的文件随时间更新。我已将此数据加载到 pandas DataFrame。我想做的是预测接下来 60 分钟的温度值。

我将开始时间更改为 0 分钟。

将开始时间更改为 0 分钟后,我编写代码以每 60 分钟显示一次时间。

date                  time   temp   humidity  wind                     
2018-10-03 06:00:00    0.0    63       0        0
2018-10-03 07:00:00   60.0    63       0        2
2018-10-03 08:00:00   120.0   104      11       0
2018-10-03 09:00:00   180.0   93       0        50
2018-10-03 10:00:00   240.0   177      0        2
2018-10-03 11:00:00   300.0   133      0        0
2018-10-03 12:00:00   360.0   70       0        0
2018-10-03 13:45:00   465.0   83       0        60
2018-10-03 15:00:00  540.0    127      0        50
2018-10-03 16:00:00  600.0    205      0        0
2018-10-03 17:00:00  660.0    298      0        0
2018-10-03 18:00:00  720.0    234      0        0
2018-10-03 19:00:00  780.0    148      0        20
2018-10-03 20:00:00  840.0    135      0        0
2018-10-03 21:30:00  930.0    100      0        50
2018-10-04 06:00:00    0.0    166      0        0
2018-10-04 07:00:00   60.0     0       0        0

之后,我编写了下一个输出温度值的代码。意味着我的第一个输出是 60 分钟时的 63(温度)。

time(t)        temp     humidity   wind     output(temp )(t+60)
 0              63        0          0         63
 60             63        0          2         104

像这样它应该运行。

我要做的是每 60 分钟显示一次输出(下一个温度值)值。输入将与 csv 文件一样添加。但输出应每 60 分钟显示一次。

我为此编写了代码。但它没有正确显示我的输出。谁能帮我解决这个问题。

我的代码:

import datetime
data = pd.read_csv('data6.csv' , sep=',')
print(data)
data['date'] = pd.to_datetime(data['date'] + " " + data['time'], format='%m/%d/%Y %H:%M:%S')
lastday = data.loc[0, 'date']
def convert_time(x):
  global lastday
  if x.date() == lastday.date():
    tm = x - lastday
    return tm.total_seconds()/60
else:
    lastday = x
    return 0

data['time'] = data['date'].apply(convert_time)
data.set_index('date', inplace=True)


data = data.values

X = 1
n_out = 1

x,y=list(),list()
start =0

for _ in range(len(data)):
  in_end = start+X
out_end= in_end + n_out
if out_end < len(data):
    x_input = data[start:in_end]
    x.append(x_input)

    while y.append(data[in_end:out_end,1]):
        if data['time'] <= 60:
            print(y)
            data['time']+=1
start +=1

 x = np.asanyarray(x)
 y = np.asanyarray(y)

我的输出:

[[ 63.][104.][ 93.][177.][133.][ 70.][ 83.][127.][205.][298.][234.][148.[135.][100.][166.]]

但是问题来了

12:00:00 之后,我测量了 13:45 的值。因此,在 12:00:00 之后,我的输出将根据 13:45(平均 465 分钟)的值显示。但是我想每 60 分钟获得一次输出,如果当时没有值,我想在那个时候把它设为 0。

我想为输出写的是

time         temp     humidity    wind
360          70        0           0
420          0         0           0
480          0         0           0

应该像这样添加输入

 time        temp  humidity  wind
 0 min        63     0         0 
 0-60 min     63     0         2
    :
    :

然后在这里

 12:00:00 ; 13:00:00 

输入:

 time (360:420 min )  70  0  0
 time (420:480 min)   83  0  0 

这是我正在尝试做的方法。但根据我的代码,它并没有很好地实现。

谁能帮我解决这个问题?

csv 文件: 我的 csv 文件。

使用重采样方法,输出:

在此处输入图像描述

然后输出:

重采样后的输出:

在此处输入图像描述

标签: pythonpandastimelstm

解决方案


考虑以下方法:

import pandas as pd

# 1.txt contains data from the question with comma as a separator
df = pd.read_csv('1.txt', parse_dates=[0])
# add column with date only
df['day'] = df['date'].dt.date

# main processing flow applied to every date
def f(a):
    # temperature
    b = a['temp']
    # date & time
    b.index = a['date']
    # resampling with 5 min step
    c = b.resample('5T').apply(lambda x: x[0] if x.count() > 0 else None)
    # linear interpolation
    d = c.interpolate('linear')
    # resampling with 1 hour step
    e = d.resample('1H').apply(lambda x: x[0])
    return e

# group by date and apply f() to every group, dfg is a pandas series
dfg = df.groupby('day').apply(lambda x: f(x)).droplevel(0)

dfg是:

date
2018-10-03 06:00:00     63.000000
2018-10-03 07:00:00     63.000000
2018-10-03 08:00:00    104.000000
2018-10-03 09:00:00     93.000000
2018-10-03 10:00:00    177.000000
2018-10-03 11:00:00    133.000000
2018-10-03 12:00:00     70.000000
2018-10-03 13:00:00     77.428571
2018-10-03 14:00:00     91.800000
2018-10-03 15:00:00    127.000000
2018-10-03 16:00:00    205.000000
2018-10-03 17:00:00    298.000000
2018-10-03 18:00:00    234.000000
2018-10-03 19:00:00    148.000000
2018-10-03 20:00:00    135.000000
2018-10-03 21:00:00    111.666667
2018-10-04 06:00:00    166.000000
2018-10-04 07:00:00      0.000000
Name: temp, dtype: float64

推荐阅读