при повторной выборке данных, почему он не пересчитывал непрерывно в CSV-файл - PullRequest
1 голос
/ 25 июня 2019

У меня есть температура в CSV-файле.Мой файл обновляется со временем.Я загрузил эти данные в панду DataFrame.Я изменил время начала на 0 минут

То, что я пытаюсь сделать, - это преобразовать эти данные из 0 минут в 60 минут и 60 минут для повторной выборки данных.Что мне нужно сделать, это добавить время от начальной строки и непрерывно читать остальную часть файла в фрейм данных, не добавляя start_time и end_time.

Пока я писал код для повторной выборки данных.Он работает правильно только в течение одного дня.Это не работает для значения времени следующего дня.Может кто-нибудь помочь мне решить эту проблему?

dataset = pd.read_csv('n.csv')
data= pd.DataFrame(dataset,columns=  ['date','time','temperature','humidity','wind'])
data['time'] = pd.to_timedelta(data['time']) 
data['time'] -= data.at[0, 'time']
data['time'] = data['time'].dt.total_seconds()
data['time']= pd.to_datetime(data['time'], unit='s')

data = (data.set_index('time')
    .resample('60T').first()
    .reset_index()
   .reindex(columns=data.columns))
data['time'] = data['time'].astype(np.int64) // 10**9

print(data)

мой CSV-файл:

enter image description here

После замены в первый раз в 0 секундзатем результаты:

enter image description here

После замены здесь я хочу повторять данные каждые 60 минут.Потому что здесь я измерил значения через 5 минут, 10 минут, 15 минут.Поэтому я хочу повторять выборку своих данных каждые 60 минут.

Итак, я написал для этого кода, и вывод будет показан ниже:

output:

    date             time   temperature  humidity  wind
      0   10/3/2018      0           63         0     0
      1   10/3/2018   3600           63         0     2
      2   10/3/2018   7200          104        11     0
      3   10/3/2018  10800           93         0    50
      4   10/3/2018  14400          177         0     2
      5   10/3/2018  18000          133         0     0
      6   10/3/2018  21600           70         0     0
      7   10/4/2018  25200          210        50    20
      8   10/5/2018  28800          170        20    40
      9   10/3/2018  32400          127         0    50
      10  10/3/2018  36000          205         0     0
      11  10/3/2018  39600          298         0     0
      12  10/3/2018  43200          234         0     0
      13  10/3/2018  46800          148         0    20
      14  10/3/2018  50400          135         0     0
      15  10/3/2018  54000          100         0    50

Но мой код плохо ответил на данные моего csv-файла.Потому что он просто отвечает только за один день данных.Но я хочу повторять выборку данных за каждый день каждые 60 минут.

Ожидаемый результат:

enter image description here CSV-файл: Мой CSV-файл.

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Ваша проблема заключается в том, что вы пытаетесь использовать столбец с неуникальными значениями в качестве индекса и повторяете выборку с ним с усечением вашего фрейма данных за один день.

Вы должны использовать истинный DatetimeIndex, содержащий обе датыи время для повторной выборки, а затем используйте время, если вы хотите:

dataset = pd.read_csv('n.csv')
data= pd.DataFrame(dataset.values, columns=['date','time','temperature',
                                    'humidity','wind'],
                   index=pd.to_datetime(dataset['date']
                                         +dataset['time'].str.rjust(9),
                                         format='%m/%d/%Y %H:%M:%S'))
data = (data.resample('60T').first())
data['time'] = pd.to_timedelta(data.index - data.index[0]).seconds

data.reset_index(drop=True, inplace=True)

Просто столбец date не обрабатывается вышеуказанным кодом - во всяком случае, я действительно не знаю, что он представляет сейчас сtime столбцы, которые не сбрасываются на дневной границе.

Результирующий кадр данных равен

         date   time  temperature  humidity  wind
0   10/3/2018      0         63.0       0.0   0.0
1   10/3/2018   3600         63.0       0.0   2.0
2   10/3/2018   7200        104.0      11.0   0.0
3   10/3/2018  10800         93.0       0.0  50.0
4   10/3/2018  14400        177.0       0.0   2.0
5   10/3/2018  18000        133.0       0.0   0.0
6   10/3/2018  21600         70.0       0.0   0.0
7   10/3/2018  25200         83.0       0.0  60.0
8         NaN  28800          NaN       NaN   NaN
9   10/3/2018  32400        127.0       0.0  50.0
10  10/3/2018  36000        205.0       0.0   0.0
11  10/3/2018  39600        298.0       0.0   0.0
12  10/3/2018  43200        234.0       0.0   0.0
13  10/3/2018  46800        148.0       0.0  20.0
14  10/3/2018  50400        135.0       0.0   0.0
15  10/3/2018  54000        100.0       0.0  50.0
16        NaN  57600          NaN       NaN   NaN
17        NaN  61200          NaN       NaN   NaN
18        NaN  64800          NaN       NaN   NaN
19        NaN  68400          NaN       NaN   NaN
20        NaN  72000          NaN       NaN   NaN
21        NaN  75600          NaN       NaN   NaN
22        NaN  79200          NaN       NaN   NaN
23        NaN  82800          NaN       NaN   NaN
24  10/4/2018      0        166.0       0.0   0.0
25  10/4/2018   3600        130.0       0.0   0.0
26  10/4/2018   7200        120.0      10.0  10.0
27  10/4/2018  10800         80.0      40.0  20.0
28        NaN  14400          NaN       NaN   NaN
29  10/4/2018  18000         60.0      70.0  50.0
...       ...    ...          ...       ...   ...
0 голосов
/ 25 июня 2019

Следующий код выполнит эту работу.

data = pd.read_csv('data.csv', sep=',')
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.resample('60T').first()

У вас есть 'date' и 'time' в разных столбцах.
То, что я сделал здесь, - это объединение строк и преобразование результата вобъекты даты и времени (сохраняются в столбце 'date').Затем вы можете выполнить повторную выборку.

Столбец 'time' изменен и теперь показывает время в минутах с начала дня.Первая строка дня (в любое время, я заметил, что это не всегда 6:00:00) устанавливается на 0.

После этого, используя предоставленный вами CSV, data будет:

                      time  temperature  humidity  wind
date                                                   
2018-10-03 06:00:00    0.0         63.0       0.0   0.0
2018-10-03 07:00:00   60.0         63.0       0.0   2.0
2018-10-03 08:00:00  120.0        104.0      11.0   0.0
2018-10-03 09:00:00  180.0         93.0       0.0  50.0
2018-10-03 10:00:00  240.0        177.0       0.0   2.0
2018-10-03 11:00:00  300.0        133.0       0.0   0.0
2018-10-03 12:00:00  360.0         70.0       0.0   0.0
2018-10-03 13:00:00  465.0         83.0       0.0  60.0
2018-10-03 14:00:00    NaN          NaN       NaN   NaN
2018-10-03 15:00:00  540.0        127.0       0.0  50.0
2018-10-03 16:00:00  600.0        205.0       0.0   0.0
2018-10-03 17:00:00  660.0        298.0       0.0   0.0

Всего 87 строк (здесь я показал только первые 12), охватывающих все дни вашего CSV-файла.У вас есть Nan значения для строк, в которых нет данных.

РЕДАКТИРОВАТЬ после комментариев

Примечание:

data = data.resample('60T').first()

Если в строке больше строкинтервал времени с передискретизацией, метод .first() использует данные первой строки интервала, отбрасывая другие.
.last() использует данные последней строки интервала.Есть и другие методы, которые вы можете использовать .mean() вычисляет среднее значение, .sum() вычисляет сумму.Используйте тот, который лучше подходит для вашего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...