pd.to_datetime не преобразует datetime в int для расчета df.rolling - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь создать скользящее среднее за 10 минут для набора данных с нерегулярным временем. Я получаю сообщение об ошибке, показанное ниже

Traceback (most recent call last):
  File "asosreaderpandas.py", line 13, in <module>
    df.rolling('10min').mean()
  File "/opt/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 8900, in rolling
    on=on, axis=axis, closed=closed)
  File "/opt/anaconda3/lib/python3.6/site-packages/pandas/core/window.py", line 2469, in rolling
    return Rolling(obj, **kwds)
  File "/opt/anaconda3/lib/python3.6/site-packages/pandas/core/window.py", line 80, in __init__
    self.validate()
  File "/opt/anaconda3/lib/python3.6/site-packages/pandas/core/window.py", line 1478, in validate
    raise ValueError("window must be an integer")
ValueError: window must be an integer

Это мой код, который я использую для создания скользящего среднего, я бы вручную вводил свои временные метки, поскольку это решало мою проблему в прошлом, за исключением .txt длина файла 98000 строк ...

import pandas as pd
from datetime import datetime

df = pd.read_csv('KART.txt', header = 0)
#indexing the date format from txt file
pd.to_datetime(df.index, format='%Y-%m-%d %H:%M')
#creating ten minute average
df.rolling('10min').mean()
print(df)

Я плохо понимаю модуль pandas, я пробовал несколько способов назначить дату и время по-разному, но безрезультатно. Я поступаю совершенно неправильно?

Образец набора данных

0,1
2019-01-01 00:00:00,4
2019-01-01 00:05:00,4
2019-01-01 00:10:00,4
2019-01-01 00:15:00,4
2019-01-01 00:25:00,5
2019-01-01 00:30:00,4
2019-01-01 00:35:00,4
2019-01-01 00:40:00,4
2019-01-01 00:45:00,4
2019-01-01 00:50:00,4
2019-01-01 00:55:00,4
2019-01-01 00:56:00,4
2019-01-01 01:00:00,4
...

1 Ответ

1 голос
/ 24 февраля 2020

В вашем коде есть несколько проблем:

  1. у вас есть автоматизированный c целочисленный индекс , назначенный вашему фрейму данных, когда вы загружаете ваш фрейм данных без указания индекс столбца (позже вы пытаетесь конвертировать в datetime, что явно не то, что вам нужно)

  2. вы не сохраняете индекс при конвертации в datetime

Вот исправленная версия:

import pandas as pd
from datetime import datetime

df = pd.read_csv('KART.txt', header = 0, index_col=0)  # <- specified column index
df.index = pd.to_datetime(df.index, format='%Y-%m-%d %H:%M')  # <- saving index when converting it to datetime
df.rolling('10min').mean()
>                     1
0   
2019-01-01 00:00:00 4.0
2019-01-01 00:05:00 4.0
2019-01-01 00:10:00 4.0
2019-01-01 00:15:00 4.0
2019-01-01 00:25:00 5.0
2019-01-01 00:30:00 4.5
2019-01-01 00:35:00 4.0
2019-01-01 00:40:00 4.0
2019-01-01 00:45:00 4.0
2019-01-01 00:50:00 4.0
2019-01-01 00:55:00 4.0
2019-01-01 00:56:00 4.0
2019-01-01 01:00:00 4.0
...

РЕДАКТИРОВАТЬ
Благодаря комментарию Parfait Вы можете получить даже более короткую версию кода, анализируя даты прямо в методе read_csv:

import pandas as pd
from datetime import datetime

df = pd.read_csv('KART.txt', 
                 header = 0, 
                 index_col=0,  # <-- specified column index
                 parse_dates=True)  # <-- parsed dates from txt

df.rolling('10min').mean()

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