当前位置: 首页 > 面试题库 >

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

商昆琦
2023-03-14
问题内容

我有一个由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被限制为唯一)。



 类似资料:
  • 问题内容: 如何找到特定列的值 最大的行 ? 将为我提供每一列的最大值,我不知道如何获取对应的行。 问题答案: 使用熊猫功能。很简单: 或者,您也可以使用,例如-它提供相同的功能,并且至少与粗略观察中的显示速度一样快。 返回索引标签,而不是整数。 示例”:如果您将字符串值作为索引标签,例如行“ a”至“ e”,则可能想知道最大值出现在第4行(而不是“ d”行)。 如果您希望该标签在其中的整数位置,

  • 我有一个非常简单的二叉树 我实现了一个函数来查找树中离目标最近的数字(19): 结果显然应该是22,但我得到了8。令人惊讶的是,当我打印所有以下“最接近”的数字时,函数似乎工作正常:它打印:8、14、22。但为什么它不返回最新的clostest数字:22?

  • 我试图解决以下问题:给定N个时间间隔,每个时间间隔指定为(开始,结束),不重叠,根据开始排序——找到一个包含给定日期的时间间隔。例如: 3人进入第一节,15人进入第四节,以此类推。 到目前为止,我有以下基本想法: 我们可以使用二进制搜索来找到相应的间隔(logn) 由于可能只有少数时间间隔较大,其余时间间隔较小,因此根据时间长短对itervals进行排序可能是值得的。然后,在统计上,大多数情况下,

  • 问题内容: 说我有一个清单。我想找到3个最接近的数字,例如6.5。然后返回的值将是。 在python中找到一个最接近的数字并不是那么棘手,可以使用 但是我试图不绕这个循环找到k个最接近的数字。有pythonic方法可以完成上述任务吗? 问题答案: 简短的答案 该 heapq.nsmallest() 函数将整齐,有效地做到这一点: 本质上是这样说的:“给我三个与 6.5 绝对差值最小的输入值”。 算

  • 问题内容: 假设我有一个像这样的DataFrame: 索引在哪里 我想在某个索引之前(或之后)得到该行。例如,我有索引(例如,通过执行),并且我想在之前获得该行,但我不知道该行具有索引。 2个子问题: 如何获得索引的位置?像这样的东西会回来,所以我可以在到达之前 有另一种解决办法,有点像选择,或者使用grep? 问题答案: 对于第一个问题: 或者 要获得周围的环境: 我使用索引和联合来删除重复项。

  • 我在尝试从时间戳查找数据中的值时出错。我的df有一个时间戳索引。 我的时间戳是: 我的df索引是这样的: 使用index.get_loc函数: 错误是: 我看到这个错误可能来自于数据帧的串联和索引的冲突,但这里的情况并非如此。有什么想法吗?