如何在Pandas数据帧索引中获取每个月的最后一天(使用timegropper)

2024-04-26 23:02:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个日期不完整的数据框,我只需要每个月最后一天的日期/行。 我尝试使用TimeGrouper,并对每个组进行.last()。在

import pandas as pd
idx = [pd.datetime(2016,2,1),pd.datetime(2017,1,20),pd.datetime(2017,2,1),pd.datetime(2017,2,27)]
df = pd.DataFrame([1,2,3,4],index=idx)
df
        0
2016-02-01  1
2017-01-20  2
2017-02-01  3
2017-02-27  4

期望:

^{pr2}$

但我得到的是:

df_eom = df.groupby(pd.TimeGrouper(freq='1M')).last()
df_eom
              0
2016-02-29  1.0
2016-03-31  NaN
2016-04-30  NaN
2016-05-31  NaN
2016-06-30  NaN
2016-07-31  NaN
2016-08-31  NaN
2016-09-30  NaN
2016-10-31  NaN
2016-11-30  NaN
2016-12-31  NaN
2017-01-31  2.0
2017-02-28  4.0

它不仅创建不在df中的日期,而且还更改了df第一行和最后一行的索引。我是不是用错了计时器?在


Tags: 数据importdataframepandasdfdatetimeindexas
2条回答

您可以按年份和月份分组,并在组中循环查找最后一个日期。是这样的:

groups = df.groupby([df.index.year, df.index.month])
df_eom = pd.DataFrame()
for idx, group in groups:
    df_eom = df_eom.append(group.iloc[-1])
df_eom
            0
2016-02-01  1
2017-01-20  2
2017-02-27  4

我真的不喜欢这样,因为循环,但考虑到你真的不能有一个惊人的年数,每年将有最多12个月的小组,这应该不会太可怕。在

有一个办法

In [795]: df.iloc[df.reset_index().groupby(df.index.to_period('M'))['index'].idxmax()]
Out[795]:
            0
2016-02-01  1
2017-01-20  2
2017-02-27  4

或者

^{pr2}$

相关问题 更多 >