2017-03-16 7 views
1

各IDが開始位置でどのくらいの時間を費やしたかを調べようとしています。各場所でIDが費やした時間を見つける

たとえば、以下のデータセットでは、id 286のGeohashの開始は「abcdef」です。 Gehash "abcdef"はId 286の3か所に現れます。 したがって、Id 286の合計時間は(2017-02-13 12:33:02.063 UTC - 2017-02-13 12:24:36 UTC)の合計です。および(2017-02-13 12:34:29 UTC - 2017-02-13 12:33:08 UTC)。

 Id   DateTime      Latitude  Longitude Geohash 
     0 286  2017-02-13 12:24:36 UTC  40.769230 -73.01205  abcdef 
     1 286  2017-02-13 12:33:02.063 UTC 40.769230 -73.01202  abcdef 
     2 286  2017-02-13 12:33:05.063 UTC 40.769230 -73.01202  cvzvvv 
     3 286  2017-02-13 12:33:08 UTC  40.769280 -73.01212  abcdef 
     4 286  2017-02-13 12:34:29 UTC  40.769306 -73.01207  hsffds 
     5 368  2017-02-13 00:23:07.063 UTC 33.392820 -111.8262  weruio 
     6 141  2017-02-13 00:00:41 UTC  33.287117 -111.84150 oqruqq 

この操作を達成するための機能がpandasデータフレームにあるかどうかは不明です。

本当にありがとうございます。 !!

答えて

1

は、あなたがあなたの例から、ダミーデータでそれをテストすることができBigQueryの標準SQL

ため
#standardSQL 
SELECT 
    Id, Geohash, MIN(DateTime) AS StartDateTime, SUM(TimeSpent) AS TimeSpent 
FROM (
    SELECT 
    Id, Geohash, DateTime, 
    TIMESTAMP_DIFF(LEAD(DateTime) OVER(PARTITION BY Id ORDER BY DateTime), DateTime, SECOND) AS TimeSpent, 
    FIRST_VALUE(Geohash) OVER(PARTITION BY Id ORDER BY DateTime) AS FirstGeohash 
    FROM yourTable 
) 
WHERE Geohash = FirstGeohash 
GROUP BY Id, Geohash 

です:

#standardSQL 
WITH yourTable AS (
    SELECT 286 AS Id, TIMESTAMP '2017-02-13 12:24:36 UTC' AS DateTime, 40.769230 AS Latitude, -73.01205 AS Longitude, 'abcdef' AS Geohash UNION ALL 
    SELECT 286, TIMESTAMP '2017-02-13 12:33:02.063 UTC', 40.769230, -73.01202, 'abcdef' UNION ALL 
    SELECT 286, TIMESTAMP '2017-02-13 12:33:05.063 UTC', 40.769230, -73.01202, 'cvzvvv' UNION ALL 
    SELECT 286, TIMESTAMP '2017-02-13 12:33:08 UTC', 40.769280, -73.01212, 'abcdef' UNION ALL 
    SELECT 286, TIMESTAMP '2017-02-13 12:34:29 UTC', 40.769306, -73.01207, 'hsffds' UNION ALL 
    SELECT 368, TIMESTAMP '2017-02-13 00:23:07.063 UTC', 33.392820, -111.8262, 'weruio' UNION ALL 
    SELECT 141, TIMESTAMP '2017-02-13 00:00:41 UTC', 33.287117, -111.84150, 'oqruqq' 
) 
SELECT 
    Id, Geohash, MIN(DateTime) AS StartDateTime, SUM(TimeSpent) AS TimeSpent 
FROM (
    SELECT 
    Id, Geohash, DateTime, 
    TIMESTAMP_DIFF(LEAD(DateTime) OVER(PARTITION BY Id ORDER BY DateTime), DateTime, SECOND) AS TimeSpent, 
    FIRST_VALUE(Geohash) OVER(PARTITION BY Id ORDER BY DateTime) AS FirstGeohash 
    FROM yourTable 
) 
WHERE Geohash = FirstGeohash 
GROUP BY Id, Geohash 

結果は以下の通りである。

Id Geohash  StartDateTime   TimeSpent  
286 abcdef  2017-02-13 12:24:36 UTC  590  
368 weruio  2017-02-13 00:23:07 UTC  null  
141 oqruqq  2017-02-13 00:00:41 UTC  null  

ご注意:590は3ページの(秒単位)timespentの和である上に - ちょうど2つのページに、それはあなたの質問に記載されていないように - 私は、これはちょうどあなたの側にタイプミスされたと仮定し

0

私が正しくあなたを理解していれば、あなたはこのような何かしたい:以下

def timedelta(df): 
    df = df.sort_values(by='DateTime') 
    return df.iloc[0]['DateTime'] - df.iloc[-1]['DateTime'] 

df.groupby(['Id', 'Geohash']).apply(timedelta) 
関連する問題