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]