pandas 如果特定日期的记录不存在,则获取最近日期的记录

olmpazwi  于 2022-12-10  发布在  其他
关注(0)|答案(1)|浏览(135)

我有一个Pandas库存记录的数据框架,我的目标是通过一个特定的“天”,例如8,并获得数据集中每个月和年的8号的过滤数据框架。我已经通过了一些SO问题,并设法获得我的要求的一部分,即获得特定天的记录,但是,如果"8号“的数据不存在特定的月和年,我需要获取此特定月份和年份中存在记录的最近一天的记录。
例如,如果我在8日传递,但没有2022年1月8日的记录,我需要查看是否存在2022年1月7日和9日的记录,依此类推...并获取最近日期的记录。
如果第7天和第9天都有记录,我将获得第9天(更高日期)的记录。
但是,如果第7个的记录存在而第9个不存在,那么我将获得第7个(最接近的)的记录。

filtered_df = data.loc[(data['Date'].dt.day == 8)]

如果需要数据集,请让我知道。我试图弄清楚,但如果有任何疑问,请让我知道。任何帮助在正确的方向是感谢。

dpiehjr4

dpiehjr41#

备选方案1

重新采样为每日分辨率,选择最近的一天来填充缺失值:

df2 = df.resample('D').nearest()
df2 = df2.loc[df2.index.day == 8]
备选方案2

一个更通用的方法(也更快一点)是生成您选择的日期/时间,然后使用reindex()和方法'nearest'。它更通用,因为您可以使用您能想到的任何一系列时间戳(不一定与任何频率对齐)。

dates = pd.date_range(
    start=df.first_valid_index().normalize(), end=df.last_valid_index(),
    freq='D')
dates = dates[dates.day == 8]
df2 = df.reindex(dates, method='nearest')

示例
让我们从一个可重现的示例开始:

import yfinance as yf

df = yf.download(['AAPL', 'AMZN'], start='2022-01-01', end='2022-12-31', freq='D')
>>> df.iloc[:10, :5]
             Adj Close                   Close                    High
                  AAPL        AMZN        AAPL        AMZN        AAPL
Date                                                                  
2022-01-03  180.959747  170.404495  182.009995  170.404495  182.880005
2022-01-04  178.663086  167.522003  179.699997  167.522003  182.940002
2022-01-05  173.910645  164.356995  174.919998  164.356995  180.169998
2022-01-06  171.007523  163.253998  172.000000  163.253998  175.300003
2022-01-07  171.176529  162.554001  172.169998  162.554001  174.139999
2022-01-10  171.196426  161.485992  172.190002  161.485992  172.500000
2022-01-11  174.069748  165.362000  175.080002  165.362000  175.179993
2022-01-12  174.517136  165.207001  175.529999  165.207001  177.179993
2022-01-13  171.196426  161.214005  172.190002  161.214005  176.619995
2022-01-14  172.071335  162.138000  173.070007  162.138000  173.779999

现在:

df2 = df.resample('D').nearest()
df2 = df2.loc[df2.index.day == 8]

>>> df2.iloc[:5, :5]
             Adj Close                   Close                    High
                  AAPL        AMZN        AAPL        AMZN        AAPL
2022-01-08  171.176529  162.554001  172.169998  162.554001  174.139999
2022-02-08  174.042633  161.413498  174.830002  161.413498  175.350006
2022-03-08  156.730942  136.014496  157.440002  136.014496  162.880005
2022-04-08  169.323975  154.460495  170.089996  154.460495  171.779999
2022-05-08  151.597595  108.789001  152.059998  108.789001  155.830002
警告

用“未来”的数据(即最近的一天在缺失的一天之后)替换缺失的一天,这被称为“超前峰值”,在使用该数据的量化研究中,这可能会导致“超前峰值偏差”,通常被认为是危险的,使用method='ffill'会更安全。

相关问题