Как написать код для отображения выходного значения каждые 60 минут, используя Python Python, используя CSV-файл - PullRequest
0 голосов
/ 04 июля 2019

У меня есть температура в CSV-файле. Мой файл обновляется со временем. Я загрузил эти данные в панду 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

После этого я написал код для следующего выходного значения температуры. означает, что мой первый вывод - 63 (темп) за 60 минут.

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-файл.

Используя метод передискретизации, выведите:

enter image description here

Тогда вывод:

Выход после повторной выборки:

enter image description here

1 Ответ

0 голосов
/ 04 июля 2019

Рассмотрим следующий подход:

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 is:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...