我的数据可以在给定日期有多个事件,也可以在某个日期没有事件。我获取这些事件,按日期获得计数,然后绘制它们。但是,在绘制它们时,我的两个系列并不总是匹配。
idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()
在上面的代码中,idx变成了一个30天的范围。09-01-2013到09-30-2013然而,S可能只有25或26天,因为在给定的日期没有发生任何事件。当我试图绘图时,我会得到一个AssertionError,因为大小不匹配:
fig, ax = plt.subplots()
ax.bar(idx.to_pydatetime(), s, color='green')
解决这个问题的正确方法是什么?我是想从IDX中删除没有值的日期,还是(我更愿意这样做)将计数为0的缺失日期添加到序列中。我更愿意得到一个30天的完整图表,其中包含0个值。如果这种方法是正确的,有什么建议吗?我需要某种动态reindex
函数吗?
下面是S(df.groupby(['simpleDate']).size()
)的一个代码片段,注意没有04和05的条目。
09-02-2013 2
09-03-2013 10
09-06-2013 5
09-07-2013 1
7条答案
按热度按时间c86crjj01#
您可以使用
Series.reindex
:收益率
2w2cym1i2#
更快的解决方法是使用
.asfreq()
,这不需要创建一个新的索引来在.reindex()
中调用。6za6bjd03#
一个问题是如果存在重复值,
reindex
将失败,假设我们正在处理带有时间戳的数据,我们希望按日期索引这些数据:收益率
由于
2016-11-16
日期重复,尝试重新索引:失败:
(by这意味着索引有重复项,而不是它本身是一个重复项)
相反,我们可以使用
.loc
来查找范围内所有日期的条目:收益率
fillna
可用于列系列以填充空白(如果需要)。9njqaruj4#
另一种方法是
resample
,它除了可以处理缺少的日期外,还可以处理重复的日期。例如:resample
和groupby
一样是一个延迟操作,所以你需要在它后面执行另一个操作,在这种情况下mean
可以很好地工作,但是你也可以使用许多其他的panda方法,比如max
,sum
,等等。以下是原始数据,但添加了"2013 - 09 - 03"的额外条目:
以下是结果:
我将缺失的日期保留为NaNs,以说明这是如何工作的,但是您可以添加
fillna(0)
,以便按照OP的要求用零替换NaNs,或者使用类似interpolate()
的内容,根据相邻行填充非零值。f8rj6qna5#
这里有一个很好的方法来填充缺失的日期到一个 Dataframe 中,你可以选择
fill_value
,days_back
来填充,以及排序顺序(date_order
)来排序 Dataframe :i5desfxk6#
您可以始终只使用
DataFrame.merge()
,利用从“所有日期”数据框到“缺少日期”数据框的左联接。示例如下。6xfqseft7#