Python 返回每月的最后日期和值(以大熊猫为单位)

Python 返回每月的最后日期和值(以大熊猫为单位),python,python-3.x,pandas,Python,Python 3.x,Pandas,我有每日数据的熊猫df。我想返回每个月的最后一个值。我认为简单的解决方案是.resample(“M”).apply(lambda ser:ser.iloc[-1,])然而,似乎resample实际上是计算月末日期,而不是返回当月出现的实际日期。这是故意的行为吗?MWE: import pandas as pd import numpy as np df = pd.Series(np.arange(100), index=pd.date_range(start="2000-01-02", peri

我有每日数据的熊猫df。我想返回每个月的最后一个值。我认为简单的解决方案是
.resample(“M”).apply(lambda ser:ser.iloc[-1,])
然而,似乎
resample
实际上是计算月末日期,而不是返回当月出现的实际日期。这是故意的行为吗?MWE:

import pandas as pd
import numpy as np
df = pd.Series(np.arange(100), index=pd.date_range(start="2000-01-02", periods=100)).to_frame()
df.sort_index().resample("M").apply(lambda ser: ser.iloc[-1,])
#             0
#2000-01-31  29
#2000-02-29  58
#2000-03-31  89
#2000-04-30  99

df
中出现的最后一个日期是
2000-04-10

时,您可能需要查看
groupby
+
tail

df.groupby(df.index.month).tail(1)
Out[18]: 
             0
2000-01-31  29
2000-02-29  58
2000-03-31  89
2000-04-10  99
通过与一起使用,您可以将样本下采样到日历月底(请参阅有关偏移量的链接文档),然后传递函数。因此,您的指数将始终是该月的最后一天,这确实是预期的行为。您正在应用的函数(
lambda ser:ser.iloc[-1,]
)只是说:对于在这一天结束的日历日期,在原始数据中找到的最后一个值是什么

例如,您还可以使用偏移量
MS
而不是
M
,对月初重新采样,结果将相同,只是索引将是日历月的第一天而不是最后一天:

# Resample to month end, as you had originally:
>>> df.sort_index().resample("M").apply(lambda ser: ser.iloc[-1,])
             0
2000-01-31  29
2000-02-29  58
2000-03-31  89
2000-04-30  99

# Resample to month start: same data, except index is month start instead of month end
>>> df.sort_index().resample("MS").apply(lambda ser: ser.iloc[-1,])
             0
2000-01-01  29
2000-02-01  58
2000-03-01  89
2000-04-01  99

正如温家宝所指出的,如果你只是想显示在数据中找到的最后一个实际日期,最好使用groupby重新采样非常有用,如果您想将数据向上或向下采样到不同的时间频率,而不是从原始时间频率中选择真实数据

是的,注意
尾部
:询问为什么
重新采样
是在弥补当月的最后日期,而不是返回当月出现的实际日期。您的解决方案有效(尽管会失败多年)@Alex使用“结束”约定按月重新采样。将值指定给期间的最后一个月。在Doc中,为什么在尝试您的方法时,我得到的
单位置索引器超出了范围