Python 返回每月的最后日期和值(以大熊猫为单位)
我有每日数据的熊猫df。我想返回每个月的最后一个值。我认为简单的解决方案是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
.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中,为什么在尝试您的方法时,我得到的单位置索引器超出了范围
?