Python 如何在时段内按天重新采样熊猫数据帧?

Python 如何在时段内按天重新采样熊猫数据帧?,python,pandas,python-datetime,Python,Pandas,Python Datetime,我有这样一个数据帧: df.head() Out[2]: price sale_date 0 477,000,000 1396/10/30 1 608,700,000 1396/10/30 2 580,000,000 1396/10/03 3 350,000,000 1396/10/03 4 328,000,000 1396/03/18 它具有超出范围的日期时间 因此,我按照下面的步骤将它们作为时段时间 df['sale_date']=df

我有这样一个数据帧:

df.head()
Out[2]: 
         price   sale_date 
0  477,000,000  1396/10/30 
1  608,700,000  1396/10/30 
2  580,000,000  1396/10/03 
3  350,000,000  1396/10/03 
4  328,000,000  1396/03/18
它具有超出范围的日期时间
因此,我按照下面的步骤将它们作为时段时间

df['sale_date']=df['sale_date'].str.replace('/','').astype(int)

def conv(x):
    return pd.Period(year=x // 10000,
                     month=x // 100 % 100,
                     day=x % 100, freq='D')
 
df['sale_date'] = df['sale_date'].str.replace('/','').astype(int).apply(conv)
现在我想按天对它们重新采样,如下所示:

df.resample(freq='d', on='sale_date').sum()
但它给了我一个错误:

resample() got an unexpected keyword argument 'freq'

在pandas 1.1.3中,
resample
Grouper
Periods
中似乎不起作用(我猜是bug):

可能的解决方案是通过
sum
进行聚合,因此如果重复
sale\u date
,则将
price
值相加:

df = df.groupby('sale_date')['price'].sum().reset_index()
print (df)
    sale_date      price
0  1396-03-18  328000000
1  1396-10-03  580000000
2  1396-10-30  477000000
3  1396-11-25  608700000
4  1396-12-05  350000000
编辑:可以通过以下方式进行编辑:


没有参数
freq
,而是
规则
。还有,如果你没有时间的话,你想怎么按天计算呢?我的意思是,逻辑上,结果将是它们自己的值(每行)。谢谢你的回答。我编辑我的数据框。现在我有一些行是同一天的。所以现在在第二天重新采样是正确的。@CainãMaxCouto Silvait现在给了我这个错误:当前不支持使用周期索引从level=或on=选择重新采样,请使用.set_index(…)显式设置索引@CainãMaxCouto-Silva@saeedzali-尝试
df.set_index('sale_date')。重新采样('D')['price'].sum()
,但对我来说不起作用。@saeedzali,是的,它似乎还没有实现,我们需要
设置索引。但我现在也试过了,对我来说也不管用。可能使用
period[D]
resample
也没有实现。很抱歉占用您的时间。如何填补数据框中datetime的空白可以用下一天和前一天的平均值来填充值吗?谢谢你的帮助@jezrael@saeedzali-你认为
df=s.reindex(rng,fill_value=0)之后的每3行是否重置_index()
?@saeedzali-我认为最好是新问题。不,我的数据帧中没有零值。例如,当那天是假日时,我有一些空白,我想通过第二天和前一天@jezrael来填补这些空白
df = df.groupby('sale_date')['price'].sum().reset_index()
print (df)
    sale_date      price
0  1396-03-18  328000000
1  1396-10-03  580000000
2  1396-10-30  477000000
3  1396-11-25  608700000
4  1396-12-05  350000000
s = df.groupby('sale_date')['price'].sum()
rng = pd.period_range(s.index.min(), s.index.max(), name='sale_date')
df = s.reindex(rng, fill_value=0).reset_index()
print (df)
      sale_date      price
0    1396-03-18  328000000
1    1396-03-19          0
2    1396-03-20          0
3    1396-03-21          0
4    1396-03-22          0
..          ...        ...
258  1396-12-01          0
259  1396-12-02          0
260  1396-12-03          0
261  1396-12-04          0
262  1396-12-05  350000000

[263 rows x 2 columns]