在Pandas中找到最接近的DataFrame行到给定时间

rob*_*ntw 13 python datetime time-series pandas

我有一个由DatetimeIndex索引的Pandas数据帧:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 53732 entries, 1993-01-07 12:23:58 to 2012-12-02 20:06:23
Data columns:
Date(dd-mm-yy)_Time(hh-mm-ss)       53732  non-null values
Julian_Day                          53732  non-null values
AOT_870                             53732  non-null values
440-870Angstrom                     53732  non-null values
440-675Angstrom                     53732  non-null values
500-870Angstrom                     53732  non-null values
Last_Processing_Date(dd/mm/yyyy)    53732  non-null values
Solar_Zenith_Angle                  53732  non-null values
time                                53732  non-null values
dtypes: datetime64[ns](2), float64(6), object(1)
Run Code Online (Sandbox Code Playgroud)

我想找到最接近某个时间的行:

image_time = dateutil.parser.parse('2009-07-28 13:39:02')
Run Code Online (Sandbox Code Playgroud)

并找出它的接近程度.到目前为止,我已经尝试了各种各样的事情,基于从所有时间减去我想要的时间并找到最小的绝对值的想法,但似乎没有一个似乎工作.

例如:

aeronet.index - image_time
Run Code Online (Sandbox Code Playgroud)

给出了一个错误,我认为是由于+/-对日期时间索引进行了转换,所以我尝试将索引放入另一列然后处理:

aeronet['time'] = aeronet.index
aeronet.time - image_time
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但要做我想要的,我需要获得绝对时差,而不是相对差异.但是,只是运行absnp.abs在它上面会出错:

abs(aeronet.time - image_time)

C:\Python27\lib\site-packages\pandas\core\series.pyc in __repr__(self)
   1061         Yields Bytestring in Py2, Unicode String in py3.
   1062         """
-> 1063         return str(self)
   1064 
   1065     def _tidy_repr(self, max_vals=20):

C:\Python27\lib\site-packages\pandas\core\series.pyc in __str__(self)
   1021         if py3compat.PY3:
   1022             return self.__unicode__()
-> 1023         return self.__bytes__()
   1024 
   1025     def __bytes__(self):

C:\Python27\lib\site-packages\pandas\core\series.pyc in __bytes__(self)
   1031         """
   1032         encoding = com.get_option("display.encoding")
-> 1033         return self.__unicode__().encode(encoding, 'replace')
   1034 
   1035     def __unicode__(self):

C:\Python27\lib\site-packages\pandas\core\series.pyc in __unicode__(self)
   1044                     else get_option("display.max_rows"))
   1045         if len(self.index) > (max_rows or 1000):
-> 1046             result = self._tidy_repr(min(30, max_rows - 4))
   1047         elif len(self.index) > 0:
   1048             result = self._get_repr(print_header=True,

C:\Python27\lib\site-packages\pandas\core\series.pyc in _tidy_repr(self, max_vals)
   1069         """
   1070         num = max_vals // 2
-> 1071         head = self[:num]._get_repr(print_header=True, length=False,
   1072                                     name=False)
   1073         tail = self[-(max_vals - num):]._get_repr(print_header=False,

AttributeError: 'numpy.ndarray' object has no attribute '_get_repr'
Run Code Online (Sandbox Code Playgroud)

我是以正确的方式接近这个吗?如果是这样,我该如何abs开始工作,这样我就可以选择最小的绝对时差,从而得到最接近的时间.如果没有,用熊猫时间序列做到这一点的最佳方法是什么?

cme*_*ren 16

这个简单的方法将返回最接近给定日期时间对象的TimeSeriesIndex条目的(整数索引).无需将索引复制到常规列 - 只需使用该.to_pydatetime方法即可.

import numpy as np

i = np.argmin(np.abs(df.index.to_pydatetime() - image_time))
Run Code Online (Sandbox Code Playgroud)

然后你只需使用DataFrame的.iloc索引器:

df.iloc[i]
Run Code Online (Sandbox Code Playgroud)

这是一个执行此操作的功能:

def fcl(df, dtObj):
    return df.iloc[np.argmin(np.abs(df.index.to_pydatetime() - dtObj))]
Run Code Online (Sandbox Code Playgroud)

然后,您可以进一步无缝过滤,例如

fcl(df, dtObj)['column']
Run Code Online (Sandbox Code Playgroud)


Cha*_*She 7

我想你可以尝试DatetimeIndex.asof找到最新的标签,包括输入.然后使用返回的datetime选择适当的行.如果您只需要特定列的值,则Series.asof存在并将上述两个步骤合并为一个.

假设您需要最接近的日期时间.如果您不关心日期并且每天只想要相同的时间,请at_time在DataFrame中使用.

跟进:

编辑:误报,我在本地有一个旧版本.最新的主人应该使用np.abs.

In [10]: np.abs(df.time - image_time)
Out[10]: 
0    27 days, 13:39:02
1    26 days, 13:39:02
2    25 days, 13:39:02
3    24 days, 13:39:02
4    23 days, 13:39:02
5    22 days, 13:39:02
Run Code Online (Sandbox Code Playgroud)

还只是为了澄清:

aeronet.index - image_time不起作用,因为Index上的减法是一个集合差异(在当天回溯过去被限制为唯一的索引).


sil*_*gon 5

我今天遇到了同样的问题。我想要一个函数能够为我提供给定时间戳之前最接近的值。这是我得到的功能:

def get_nearest_past(data, timestamp):
    index = data.index.get_loc(timestamp,"ffill")
    return data.iloc[index]
Run Code Online (Sandbox Code Playgroud)

如果您需要全局最接近的(而不是像我的情况一样之前最接近的),您可以使用:

def get_nearest(data, timestamp):
    index = data.index.get_loc(timestamp,"nearest")
    return data.iloc[index]
Run Code Online (Sandbox Code Playgroud)

您可以在文档中找到更多信息get_loc