pandas Dataframe重新采样特定日期

时间:2017-01-25 14:23:00

标签: python pandas resampling

我对pandas Dataframes的重采样方法有疑问。 我有一个每天观察一次的DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=(366, 1)), columns=list('A'))
df.index = pd.date_range(datetime.date(2016,1,1),datetime.date(2016,12,31))

如果我想计算每月的总和(或其他),我可以直接做:

EOM_sum = df.resample(rule="M").sum()

但是我有一个特定的日历(不规则频率):

import datetime
custom_dates = pd.DatetimeIndex([datetime.date(2016,1,13),
                             datetime.date(2016,2,8),
                             datetime.date(2016,3,16),
                             datetime.date(2016,4,10),
                             datetime.date(2016,5,13),
                             datetime.date(2016,6,17),
                             datetime.date(2016,7,12),
                             datetime.date(2016,8,11),
                             datetime.date(2016,9,10),
                             datetime.date(2016,10,9),
                             datetime.date(2016,11,14),
                             datetime.date(2016,12,19),
                             datetime.date(2016,12,31)])

如果我想计算每个句点的总和,我目前在每个行所属的句点结束时向df添加一个临时列,然后使用groupby执行操作:

df["period"] = custom_dates[custom_dates.searchsorted(df.index)]
custom_sum = df.groupby(by=['period']).sum()

然而,这很脏,看起来并不像pythonic。在Pandas中有没有内置方法可以做到这一点? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

无需创建新列,groupby可以DatatimeIndex,因为lengthlenght的{​​{1}}相同:

df
import pandas as pd
import numpy as np

np.random.seed(100)
df = pd.DataFrame(np.random.randint(0,100,size=(366, 1)), columns=list('A'))
df.index = pd.date_range(datetime.date(2016,1,1),datetime.date(2016,12,31))
print (df.head())
             A
2016-01-01   8
2016-01-02  24
2016-01-03  67
2016-01-04  87
2016-01-05  79

import datetime
custom_dates = pd.DatetimeIndex([datetime.date(2016,1,13),
                             datetime.date(2016,2,8),
                             datetime.date(2016,3,16),
                             datetime.date(2016,4,10),
                             datetime.date(2016,5,13),
                             datetime.date(2016,6,17),
                             datetime.date(2016,7,12),
                             datetime.date(2016,8,11),
                             datetime.date(2016,9,10),
                             datetime.date(2016,10,9),
                             datetime.date(2016,11,14),
                             datetime.date(2016,12,19),
                             datetime.date(2016,12,31)])

另一个解决方案是custom_sum = df.groupby(custom_dates[custom_dates.searchsorted(df.index)]).sum() print (custom_sum) A 2016-01-13 784 2016-02-08 1020 2016-03-16 1893 2016-04-10 1242 2016-05-13 1491 2016-06-17 1851 2016-07-12 1319 2016-08-11 1348 2016-09-10 1616 2016-10-09 1523 2016-11-14 1793 2016-12-19 1547 2016-12-31 664 附加新的indexcustom_dates使用groupby作为numpy array函数的输出:

searchsorted