17

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

これは機能しているようですが、私がやりたいことを行うには、相対的な差ではなく、絶対的な時間差を取得する必要があります。ただし、実行したり、実行しabsたりnp.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もしそうなら、最小の絶対時差を選択して最も近い時間を取得できるように、どうすれば仕事に取り掛かることができますか。そうでない場合、パンダの時系列でこれを行う最良の方法は何ですか?

4

3 に答える 3

19

この単純なメソッドは、指定された日時オブジェクトに最も近い TimeSeriesIndex エントリ (の整数インデックス) を返します。インデックスを通常の列にコピーする必要はありません.to_pydatetime。代わりにメソッドを使用するだけです。

import numpy as np

i = np.argmin(np.abs(df.index.to_pydatetime() - image_time))

次に、DataFrame の.ilocインデクサーを使用するだけです。

df.iloc[i]

これを行う関数は次のとおりです。

def fcl(df, dtObj):
    return df.iloc[np.argmin(np.abs(df.index.to_pydatetime() - dtObj))]

その後、さらにシームレスにフィルタリングできます。

fcl(df, dtObj)['column']
于 2013-11-14T09:54:50.967 に答える
7

DatetimeIndex.asof入力までの最新のラベルを見つけようとすることができると思います。次に、返された日時を使用して適切な行を選択します。特定の列の値のみが必要な場合は、Series.asof存在し、上記の 2 つの手順を 1 つに結合します。

これは、最も近い日時が必要であると想定しています。日付を気にせず、毎日同じ時刻が必要な場合は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

また、明確にするために:

aeronet.index - image_time は機能しません。これは、Index の減算がセットの差であるためです (昔は、Index は一意になるように制約されていました)。

于 2013-02-27T15:46:20.140 に答える
1

今日も同じ問題に直面していました。特定のタイムスタンプより前の最も近い値を取得できる関数が必要でした。これが私が得た機能です:

def get_nearest_past(data, timestamp):
    index = data.index.get_loc(timestamp,"ffill")
    return data.iloc[index]

グローバルに最も近いものが必要な場合(私の場合のように以前に最も近いものではない)、次を使用できます。

def get_nearest(data, timestamp):
    index = data.index.get_loc(timestamp,"nearest")
    return data.iloc[index]

詳細については、get_locドキュメントを参照してください。

于 2018-08-31T12:46:38.807 に答える