Python 是否以指定的间隔重新采样?
更新:我更新了我的示例,稍微澄清了我的问题Python 是否以指定的间隔重新采样?,python,datetime,pandas,Python,Datetime,Pandas,更新:我更新了我的示例,稍微澄清了我的问题 我有一个带有日期索引和值的数据框,如: date | value | ------------+-------| category A 2016-01-04 | 6 | 2016-01-05 | 4 | 2016-01-07 | 16 | 2016-01-10 | 0 |
我有一个带有日期索引和值的数据框,如:
date | value |
------------+-------|
category
A 2016-01-04 | 6 |
2016-01-05 | 4 |
2016-01-07 | 16 |
2016-01-10 | 0 |
2016-01-12 | 7 |
B 2016-01-20 | 0 |
2016-01-22 | 8 |
2016-01-29 | 5 |
2016-01-30 | 4 |
我想对数据帧进行重采样,但要在每个类别的特定间隔(如“2016-01-01”到“2016-01-31”)之间,并用零填充所有Na值
这就是我想要的:
date | value |
------------+-------|
Category
A 2016-01-01 | 0 |
2016-01-02 | 0 |
2016-01-03 | 0 |
2016-01-04 | 6 |
.....
2016-01-29 | 0 |
2016-01-30 | 0 |
2016-01-31 | 0 |
B 2016-01-01 | 0 |
2016-01-02 | 0 |
2016-01-03 | 0 |
2016-01-04 | 0 |
.....
2016-01-29 | 5 |
2016-01-30 | 4 |
2016-01-31 | 0 |
我可以这样做:(但是速度很慢。有更好的方法吗?)
将上表存储在名为data的数据框中
idx = pd.DatetimeIndex(start='2016-1-1', end='2016-1-31', freq='D')
df=pd.DataFrame(columns=['category','date','value'])
data.reset_index('category',inplace=True)
for a,b in data.groupby(['category']):
b.set_index('date',inplace=True)
b.reindex(idx,fill_value=0)
b.reset_index('date')
df=pd.concat([df,b])
这也会浪费大量内存。
我不想先创建日期索引,然后再添加值。
有没有一种方法可以使用重采样来转换上述内容。解决方案是创建一个包含完整日期范围的数据框,其中包含0:
df2 = pd.DataFrame(0, index=pd.date_range('2016-01-01', '2016-01-31'), columns=['values'])
然后先使用combine_
将原始值填入其中(如果可用):
df.combine_first(df2)
输出:
values
2016-01-01 0
2016-01-02 0
2016-01-03 0
2016-01-04 6
2016-01-05 4
2016-01-06 0
2016-01-07 16
我相信您希望指定开始和结束日期,然后重新编制重采样数据的索引(0.17+)
嗨,谢谢你的帮助。但是,我正在尝试重新索引groupBy对象中的日期。我有几个类别,每个类别都有一个日期和一些值。我希望所有类别都有一个明确的间隔,如果日期的值丢失,则每个类别都要用0填充。
# Sample data.
df = pd.DataFrame({'a': range(5), 'b': range(5)}, index=pd.DatetimeIndex(start='2016-1-1', periods=5, freq='D'))
idx = pd.DatetimeIndex(start='2016-1-1', end='2016-2-29', freq='D') # freq='B' for weekdays.
df.reindex(idx, fill_value=0).head(8)
a b
2016-01-01 0 0
2016-01-02 1 1
2016-01-03 2 2
2016-01-04 3 3
2016-01-05 4 4
2016-01-06 0 0
2016-01-07 0 0
2016-01-08 0 0