2

これは、データ生成を容易にするために考案された例ですが、一般に、これは幅広い対象者に当てはまる問題であるはずです。

私は次のような時系列の測定値を持っています:

In [1]: import pandas as pd

In [2]: index = pd.date_range(start="18:10",periods=20,freq='min')

In [3]: df = pd.DataFrame(randn(20,3),columns=list('abc'),index=index)

In [4]: df.head()
Out[4]: 
                            a         b         c
2013-02-27 18:10:00 -1.344753  0.438351  1.561849
2013-02-27 18:11:00  1.715643  1.601984 -0.027408
2013-02-27 18:12:00 -0.142264 -0.049462  0.482493
2013-02-27 18:13:00  0.132617  0.737902 -0.347620
2013-02-27 18:14:00  1.277257  0.083401  0.649422

「実際の」測定の間に、校正測定が行われていますが、測定よりもはるかに低い頻度で、たとえば次のようになります。

In [5]: calindex = pd.date_range("18:12:30",periods=4,freq='5min')

In [6]: caldata = pd.Series([10,20,30,40],index = calindex)

In [7]: caldata
Out[7]: 
2013-02-27 18:12:30    10
2013-02-27 18:17:30    20
2013-02-27 18:22:30    30
2013-02-27 18:27:30    40
Freq: 5T

現在の一般的な考え方は、これらのキャリブレーションデータを測定に適用することです。このために、「最も近い時間」のアプローチでキャリブレーションデータを配布/ブロードキャストしたいので、たとえば、「オフセット」と呼ばれる別の列を生成します。この列には、測定値の各行にそのキャリブレーション値があります。各測定値の時間に最も近い時間で決定されます。

したがって、私は次のような最終結果を求めています。

In [14]: df
Out[14]: 
                            a         b         c  offsets
2013-02-27 18:10:00 -1.344753  0.438351  1.561849       10
2013-02-27 18:11:00  1.715643  1.601984 -0.027408       10
2013-02-27 18:12:00 -0.142264 -0.049462  0.482493       10
2013-02-27 18:13:00  0.132617  0.737902 -0.347620       10
2013-02-27 18:14:00  1.277257  0.083401  0.649422       10
2013-02-27 18:15:00  0.048120  0.421220  0.149372       20
2013-02-27 18:16:00  0.812317 -1.517389  2.035487       20
2013-02-27 18:17:00 -0.058959 -0.034876 -1.535118       20
2013-02-27 18:18:00 -0.666227  0.040208 -1.042464       20
2013-02-27 18:19:00 -0.077031 -0.158351 -0.441992       20
2013-02-27 18:20:00  0.103083 -0.129341  0.294073       30
2013-02-27 18:21:00  0.900802  0.443271 -0.946229       30
2013-02-27 18:22:00  0.744631 -0.058666 -0.386226       30
2013-02-27 18:23:00 -0.064313  0.500321 -0.536237       30
2013-02-27 18:24:00 -0.392653  0.789827  0.000109       30
2013-02-27 18:25:00  1.926765  0.252259 -0.051475       40
2013-02-27 18:26:00 -0.035577  0.559222 -0.290751       40
2013-02-27 18:27:00  1.726165  0.626515 -0.868177       40
2013-02-27 18:28:00  1.269409  1.520980 -0.181637       40
2013-02-27 18:29:00 -1.151166 -0.300196  0.420747       40

.map、.applyなどを介した他の列への値の適用。よく理解していると思いますが、値の分散に必要な時間またはオフセットのトリックは、私には何の手がかりもありません。で開始する。

pandas.DateOffsetsで攻撃する必要がありますか?パンダ内の時間差を最小化するための機械はどこかにありますか?

私は正しい方向に少しずつ進んでいただければ幸いです。完全である必要はなく、私が進む必要のある方向だけです。

4

1 に答える 1

3

I use numpy functions to calculate the nearest time location:

from numpy.random import randn
import numpy as np
import pandas as pd

index = pd.date_range(start="18:10",periods=20,freq='min')
df = pd.DataFrame(randn(20,3),columns=list('abc'),index=index)
calindex = pd.date_range("18:12:30",periods=4,freq='5min')
caldata = pd.Series([10,20,30,40],index = calindex)

# if you use numpy 1.7
real_time = df.index.values
cali_time = caldata.index.values

# if you use numpy 1.6
real_time = np.array(df.index.values.view("i8") / 1000, dtype="datetime64[us]")
cali_time = np.array(caldata.index.values.view("i8") / 1000, dtype="datetime64[us]")

right_index = cali_time.searchsorted(real_time, side="left")
left_index = np.clip(right_index - 1, 0, len(caldata)-1)
right_index = np.clip(right_index, 0, len(caldata)-1)
left_time = cali_time[left_index]
right_time = cali_time[right_index]
left_diff = np.abs(left_time - real_time)
right_diff = np.abs(right_time - real_time)
caldata2 = caldata[np.where(left_diff < right_diff, left_time, right_time)]
df["offset"] = caldata2.values
于 2013-02-28T04:54:41.187 に答える