Как мне суммировать данные временных рядов по дням в Python? resample.sum () не имеет никакого эффекта

1

Я новичок в Python. Как суммировать данные на основе даты и построить результат?

У меня есть объект серии с такими данными, как:

2017-11-03 07:30:00      NaN
2017-11-03 09:18:00      NaN
2017-11-03 10:00:00      NaN
2017-11-03 11:08:00      NaN
2017-11-03 14:39:00      NaN
2017-11-03 14:53:00      NaN
2017-11-03 15:00:00      NaN
2017-11-03 16:00:00      NaN
2017-11-03 17:03:00      NaN
2017-11-03 17:42:00    800.0
2017-11-04 07:27:00    600.0
2017-11-04 10:10:00      NaN
2017-11-04 11:48:00      NaN
2017-11-04 12:58:00    500.0
2017-11-04 13:40:00      NaN
2017-11-04 15:15:00      NaN
2017-11-04 16:21:00      NaN
2017-11-04 17:37:00    500.0
2017-11-04 21:37:00      NaN
2017-11-05 03:00:00      NaN
2017-11-05 06:30:00      NaN
2017-11-05 07:19:00      NaN
2017-11-05 08:31:00    200.0
2017-11-05 09:31:00    500.0
2017-11-05 12:03:00      NaN
2017-11-05 12:25:00    200.0
2017-11-05 13:11:00    500.0
2017-11-05 16:31:00      NaN
2017-11-05 19:00:00    500.0
2017-11-06 08:08:00      NaN

У меня есть следующий код:

# load packages
import pandas as pd
import matplotlib.pyplot as plt

# import painkiller data
df = pd.read_csv('/Users/user/Documents/health/PainOverTime.csv',delimiter=',')

# plot bar graph of date and painkiller amount
times = pd.to_datetime(df.loc[:,'Time'])

ts = pd.Series(df.loc[:,'acetaminophen'].values, index = times,
               name = 'Painkiller over Time')
ts.plot()

Это дает мне следующий график (?):

Изображение 174551

Это начало; теперь я хочу суммировать дозы по дате. Однако этот код не вносит никаких изменений: результирующий график тот же. Что случилось?

ts.resample('D',closed='left', label='right').sum()
ts.plot()

Я также попробовал ts.resample('D').sum() ts.resample('1d').sum() ts.resample('D').sum(), ts.resample('1d').sum() ts.resample('1D').sum() ts.resample('1d').sum(), ts.resample('1D').sum(), но изменений в сюжет.

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

А именно, я надеюсь на какой-то результат (на основе приведенных выше данных), например:

2017-11-03 800
2017-11-04 1600
2017-11-05 1900
2017-11-06 NaN
Теги:
pandas
dataframe
aggregate
sum

3 ответа

0
Лучший ответ

Этот ответ помог мне понять, что мне нужно назначить его новому объекту (если это правильная терминология):

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('/Users/user/Documents/health/PainOverTime.csv',delimiter=',')
# plot bar graph of date and painkiller amount
times = pd.to_datetime(df.loc[:,'Time'])

# raw plot of data
ts = pd.Series(df.loc[:,'acetaminophen'].values, index = times,
               name = 'Painkiller over Time')
fig1 = ts.plot()

# combine data by day
test2 = ts.resample('D').sum()
fig2 = test2.plot()

Это дает следующие графики:

Изображение 174551

Изображение 174551

Этот метод не лучше, чем функция "groupby"?

Теперь, как сделать график разброса или бар, а не этот сюжет линии...?

  • 0
    попробовал поискать в Google Теперь, как я могу сделать точечный или линейный график вместо этого линейного графика ...?
  • 0
    resample будет иметь тот же результат и будет иметь более короткую запись, но groupby не является явным и очень традиционным (он похож на синтаксис SQL-запросов), что хорошо для Learnign для манипулирования данными.
Показать ещё 1 комментарий
2

Используйте функцию pandas groupby.

import io
import pandas as pd

data = io.StringIO('''
2017-11-03 07:30:00,NaN
2017-11-03 09:18:00,NaN
2017-11-03 10:00:00,NaN
2017-11-03 11:08:00,NaN
2017-11-03 14:39:00,NaN
2017-11-03 14:53:00,NaN
2017-11-03 15:00:00,NaN
2017-11-03 16:00:00,NaN
2017-11-03 17:03:00,NaN
2017-11-03 17:42:00,800.0
2017-11-04 07:27:00,600.0
2017-11-04 10:10:00,NaN
2017-11-04 11:48:00,NaN
2017-11-04 12:58:00,500.0
2017-11-04 13:40:00,NaN
2017-11-04 15:15:00,NaN
2017-11-04 16:21:00,NaN
2017-11-04 17:37:00,500.0
2017-11-04 21:37:00,NaN
2017-11-05 03:00:00,NaN
2017-11-05 06:30:00,NaN
2017-11-05 07:19:00,NaN
2017-11-05 08:31:00,200.0
2017-11-05 09:31:00,500.0
2017-11-05 12:03:00,NaN
2017-11-05 12:25:00,200.0
2017-11-05 13:11:00,500.0
2017-11-05 16:31:00,NaN
2017-11-05 19:00:00,500.0
2017-11-06 08:08:00,NaN
''')
column_names = ['date', 'val']
df = pd.read_csv(data, sep=',', header = None, names = column_names)
df['date'] = pd.to_datetime(df['date'])
df = df.groupby(df['date'].dt.date)[['val']].sum()
df.plot()
  • 0
    Почему лучше использовать groupby чем моё решение ниже, используя resample ?
0

Короткий ответ: вам нужна .groupby(), а не .resample(), как в этом ответе

Более длинный код:

import pandas as pd
from io import StringIO

doc = StringIO("""2017-11-03 07:30:00      NaN
2017-11-03 09:18:00      NaN
2017-11-03 10:00:00      NaN
2017-11-03 11:08:00      NaN
2017-11-03 14:39:00      NaN
2017-11-03 14:53:00      NaN
2017-11-03 15:00:00      NaN
2017-11-03 16:00:00      NaN
2017-11-03 17:03:00      NaN
2017-11-03 17:42:00    800.0
2017-11-04 07:27:00    600.0
2017-11-04 10:10:00      NaN
2017-11-04 11:48:00      NaN
2017-11-04 12:58:00    500.0
2017-11-04 13:40:00      NaN
2017-11-04 15:15:00      NaN
2017-11-04 16:21:00      NaN
2017-11-04 17:37:00    500.0
2017-11-04 21:37:00      NaN
2017-11-05 03:00:00      NaN
2017-11-05 06:30:00      NaN
2017-11-05 07:19:00      NaN
2017-11-05 08:31:00    200.0
2017-11-05 09:31:00    500.0
2017-11-05 12:03:00      NaN
2017-11-05 12:25:00    200.0
2017-11-05 13:11:00    500.0
2017-11-05 16:31:00      NaN
2017-11-05 19:00:00    500.0
2017-11-06 08:08:00      NaN""")

df = pd.read_csv(doc, sep='\\s{2,}', 
                 header=None, 
                 converters={'timestamp': pd.to_datetime}, 
                 names = ['timestamp', 'acetaminophen'],
                 engine='python')
df = df.set_index('timestamp')

#true, but rather ugly x axis line
df.plot.bar()

df1 = df.groupby(by=[df.index.date]).sum()
df1.plot.bar()

Если даты не постоянны, вы можете создать пустой фреймворк с полным индексом timeindex и слить df1 с ним.

  • 0
    Зачем мне нужен groupby вместо resample groupby ?
  • 0
    Вы можете использовать либо. groupby немного более выразителен (для меня), также resample - это просто обёртка вокруг groudbyas, увиденного здесь . Однако ваша первоначальная ошибка не была связана с этим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню