从输入文件保留最后日期时重新​​采样(而不是由`resample`计算的最后一天)

时间:2013-12-16 14:27:12

标签: python pandas time-series resampling

使用python pandas(但对任何其他解决方案开放),我想上传一个DataFrame,同时保持输入文件的最后日期DataFrame.resample的默认工作方式是计算月的最后一天。这是我的例子:

>>> import pandas as pd
>>> import numpy as np
>>> begin = pd.datetime(2013,1,1)
>>> end = pd.datetime(2013,2,20)
>>> dtrange = pd.date_range(begin, end, freq='5D')
>>> values = np.random.rand(len(dtrange))*10
>>> df = pd.DataFrame({'values': values}, index=dtrange)
>>> df
              values
2013-01-01  7.763089
2013-01-06  6.032173
2013-01-11  9.747979
2013-01-16  0.856741
2013-01-21  7.111047
2013-01-26  2.654279
2013-01-31  5.222770
2013-02-05  9.578846
2013-02-10  5.088311
2013-02-15  4.193273
2013-02-20  3.345553
>>> df.resample('M', how='last')
              values
2013-01-31  5.222770
2013-02-28  3.345553

我期望的输出是:

              values
2013-01-31  5.222770
2013-02-20  3.345553

请注意日期2013-02-20。这是我输入数据的真实日期,而不是resample创建的日期。

1 个答案:

答案 0 :(得分:3)

也许不是最奇特的方式,但您可以始终groupby您的时间频率并应用自定义函数返回您想要的内容。

从DataFrame中返回最后一个值的函数:

my_resample = lambda x: x.sort_index().tail(1)

然后按月频率分组并应用函数:

df.groupby(pd.TimeGrouper(freq='M'), group_keys=False).apply(my_resample)

结果是:

              values
2013-01-31  5.167121
2013-02-20  4.829109