タイムスタンプ列の差を計算する(SPSS Modeler データ加工逆引き1-9)

# タイムスタンプ列の差を計算する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c5b5d11b-90a0-e86e-9f1f-29dc88653972.png)



## 1.想定される利用目的
タイムスタンプの差をHH:MM:SSで詳細に把握したい

## 2.サンプルストリームのダウンロード

https://github.com/hkwd/spsssample/raw/master/220805%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%81%AE%E5%B7%AE%E3%81%AE%E8%A8%88%E7%AE%97/tsdiff.str

## 3.サンプルストリームの説明

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/806f536a-eb08-0c7c-547a-32fd125effe2.png)


①入力するデータは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4e09e3fa-2297-7c60-c164-8d45d1ae90d6.png)


### 時間の差の計算
②[フィールド作成]ノードを編集します。[datetime_in_seconds(フィールド)]でタイムスタンプをシリアル値に変換してから差をとり、[datetime_time()]でタイム型に変換します。

```python
datetime_time(
datetime_in_seconds(E_TS) - datetime_in_seconds(S_TS)
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/742a1479-fd41-7033-4c3d-aecbfe01a998.png)


式ビルダーの文字列関数を利用すると便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0678c3d2-ca26-0d89-b640-e179851d66fc.png)



プレビューを実行すると時間の差の計算結果[TIME_DIFF]が出来ています。
datetime_timeをつかうと日付部分は切り捨てられます。24時間以上の差が出ないことがわかっている場合は問題ありません。つまり、1行目と2行目のデータのように24時間以内の差であるようなデータ場合です。
しかし、3行目のように24時間を超える差があるデータがある場合、日付部分が無視されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a91cc35e-2f13-f598-81ce-2c0ce6b6b990.png)


### タイムスタンプの差の計算
③[フィールド作成]ノードを編集します。[datetime_in_seconds(フィールド)]でタイムスタンプをシリアル値に変換してから差をとり、[datetime_timestamp()]でタイムスタンプ型に変換します。②との違いはdatetime_timeではなく、datetime_timestampを使うことです。

```python
datetime_timestamp(
datetime_in_seconds(E_TS) - datetime_in_seconds(S_TS)
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/600c3941-dfa2-dbe6-b7f6-e8c11333f822.png)

プレビューを実行するとタイムスタンプの差の計算結果[TS_DIFF]が出来ています。
datetime_timestampをつかうと1900-01-01を起点としたタイムスタンプデータになります。
3行目のように24時間を超える差があるデータがある場合でも3日分の差があることがわかります。
ただ、これは少し読み取りにくいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/495b0876-241e-0d60-888f-29be8a9346c0.png)

### 24時間を超える時間差の計算
③[フィールド作成]ノードを編集します。
([datetime_day(TS_DIFF)]-1)*24で24時間を超える日を時間に換算しています。そしてdatetime_hour(TS_DIFF)で時間を足しています。
分と秒はdatetime_minuteとdatetime_secondで取得しています。
時、分、秒はendstring(2,'0'><....)で囲むことで二桁に固定しています。桁をそろえておくと比較やソートが可能です。
時間が100時間を超える場合にはendstring(3,'00'><....)のような修正が必要です。
また、結果は文字列型になりますので、日時系の関数は使えなくなります。

```python
endstring(2,'0'><to_string((datetime_day(TS_DIFF)-1)*24+datetime_hour(TS_DIFF))) >< ':' >< 
endstring(2,'0'><to_string(datetime_minute(TS_DIFF)))>< ':' >< 
endstring(2,'0'><to_string(datetime_second(TS_DIFF)))

```

プレビューを実行するとタイムスタンプの差の計算結果[TS_DIFF]が出来ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1a8591b5-bede-928c-5212-5bd735793931.png)

3日*24時間と07:41:17を足した79:41:17が出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8dc52c60-f518-cd25-a9f6-b8f7ab9caaa8.png)





## 4.参考情報

#### SPSS Modelerのタイムスタンプ関連clem関数をPythonで書き換える。 - Qiita 

https://qiita.com/kawada2017/items/0546580314f5b67408b1#5m-%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%81%AE%E5%B7%AE%E3%81%AE%E8%A8%88%E7%AE%97modeler%E7%89%88

#### SPSS ModelerのCLEM式でよく使う「日付と時刻」関数 - Qiita 

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4#%E6%97%A5%E4%BB%98%E3%82%84%E6%99%82%E5%88%BB%E3%81%AE%E5%B7%AE%E3%82%92%E6%B1%82%E3%82%81%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88


#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee