[英]How do I sum time series data by day in Python? resample.sum() has no effect
我是Python的新手。 如何根據日期對數據求和並繪制結果?
我有一個帶有數據的Series對象:
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()
這給了我下面的line(?)圖:
這是一個開始; 現在我想按日期對劑量求和。 但是,此代碼無法實現任何更改:結果圖相同。 怎么了?
ts.resample('D',closed='left', label='right').sum()
ts.plot()
我也嘗試過ts.resample('D').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 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()
這個答案幫助我了解到我需要將其分配給新對象(如果這是正確的術語):
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()
這將產生以下圖:
這種方法是否不比“ groupby”功能更好?
現在如何制作散點圖或條形圖而不是此線圖...?
簡短答案:您需要.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
與之合並。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.