在pandas中查找距给定时间最近的DataFrame行

我有一个由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)

我想找到最接近特定时间的行:

image_time = dateutil.parser.parse('2009-07-28 13:39:02')

并找到它有多近。到目前为止,我已经基于从所有时间中减去我想要的时间并找到最小的绝对值的想法进行了各种尝试,但是似乎没有一个奏效。

例如:

aeronet.index - image_time

给出一个错误,我认为是由于Datetime索引上的+/-发生了偏移,因此我尝试将索引放入另一列中,然后进行处理:

aeronet['time'] = aeronet.index

aeronet.time - image_time

这似乎可行,但是要做我想做的事,我需要得到绝对时差,而不是相对时差。但是,仅在上面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'

我是否采用正确的方法?如果是这样,我应该如何abs工作,以便可以选择最小绝对时差,从而获得最接近的时间。如果没有,用熊猫时间序列做到这一点的最佳方法是什么?

回答:

我认为您可以尝试DatetimeIndex.asof查找直到输入(包括输入)的最新标签。然后使用返回的日期时间选择适当的行。如果只需要特定列的值,Series.asof则将其存在并将以上两个步骤合并为一个。

假设您想要最接近的日期时间。如果您不关心日期,只是想每天都在同一时间,请at_time在DataFrame中使用。

跟进:

编辑:错误警报,我在本地有旧版本。最新的master应该可以与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

也只是为了澄清一下:

aeronet.index-image_time不起作用,因为对Index的减法是一个设定差(过去,Index被限制为唯一)。

以上是 在pandas中查找距给定时间最近的DataFrame行 的全部内容, 来源链接: utcz.com/qa/417617.html

回到顶部