らくがきちょう

文字数制限の無いTwitter的な

(解析メモ)Excelで時刻データを扱う2

関連記事

(解析メモ)時刻のデータをExcelやMatlabで扱う - らくがきちょう

 

調査票とかをよく考えずに入力したり、使ってたサービスの仕様の問題だったりで、時刻データをどう計算するか迷った経験。あると思います(私だけ?)

f:id:MshrOkn:20210827160425p:plain

どうしてこうなった

大丈夫、なんとかするための関数はあります。

f:id:MshrOkn:20210827161529p:plain

なんとかなった

解説(すべて2行目の入力として)

B列「入眠」

次のように入力しています: =LEFT(A2, FIND("-", A2)-1)

LEFT(文字列, 文字数) 関数は、入力文字列のうち左から指定文字数だけ抜き出してくる関数です。たとえば = LEFT("hogehoge", 3) と入力すると hog が返ってきます。

文字列の部分にセルを指定すれば、セル内に入力された文字列を入力したことになります。

そしていま文字数のところに入れた FIND("-", A2) はFIND(検索文字列, 対象) 関数で、対象として指定した場所において、検索文字列が左から何文字目にあるかを探し出します。

つまり FIND("-", A2)-1 で「入眠時刻と起床時刻をつなぐハイフンの1つ前まで」の文字数が返ってきます。これで入眠時刻が日をまたいだりまたいでなかったりしても問題なくなります。

 

C列「起床」

次のように入力しています: =RIGHT(A2, LEN(A2)-FIND("-", A2))

RIGHT(文字列, 文字数) 関数はLEFTと同様、入力文字列のうち右から指定文字数だけ抜き出してくる関数です。 =RIGHT("hogehoge", 3)なら oge が返ってきます。

文字数のところには先ほどのFINDともうひとつ、LEN 関数を使います。LEN(文字列)は、入力した文字列の文字数を返す関数です。=LEN("hogehoge")なら8が返ってきます。

つまり LEN(A2)-FIND("-", A2) で、ハイフンまでの左からの文字数を全体の長さから引いた長さとなり、ハイフンの右側の文字列が返ってきます。

 

D列「入眠(シリアル値)」とE列「起床(シリアル値)」

次のように入力しています: =IF(TIMEVALUE(B2) > 0.5, TIMEVALUE(B2)-1, TIMEVALUE(B2)) 

IF関数はIF(論理式, 真の場合, 偽の場合) で、「論理式」のところに入力した等式や不等式が満たされる(真)か満たされない(偽)かでそれぞれ別の値を返してくれます。

つまり TIMEVALUE(B2) が0.5より大きければ TIMEVALUE(B2)-1 を、0.5以下であれば TIMEVALUE(B2) を返してくださいという意味です。

で、このTIMEVALUEとはなにかというと、=TIMEVALUE(時刻) で、入力した時刻に対応するシリアル値を返してくれる関数です。時刻シリアル値とは、1日の24時間の間に現れる時刻(秒)を0~1の値で表した数値です。

たとえば0時0分0秒は0、12時0分0秒は0.5、18時0分0秒は0.75になります。より細かく言えば、24時間=86,400秒なので、1秒経過するごとに時刻シリアル値は 86,400分の1ずつ増えていきます。

つまりここのIF文に書いたことは、「B2の時刻が昼の12時より後なら時刻シリアル値から1引いた値、昼の12時より前ならそのままのシリアル値を返して下さい」ということです。「時刻シリアル値から1を引く」ことで、たとえば「昨日の夜9時」を「今日の-3時」みたいな表し方にできます。境目を昼の12時にしてるのはとりあえずです。真っ昼間から寝てる人がいた場合はまた別の値にするとか例外処理とか工夫が必要になりますかね…

 

E列「起床(シリアル値)」

次のように入力しています: =TIMEVALUE(C2)

ここはさすがに今日の起床時間になってると思うのでとりあえずこうしてます。24時過ぎに起きた人がいたらそれはそのとき考えましょう…

 

F列「睡眠時間(シリアル値)」

次のように入力しています: =E2-D2

シリアル値で表した起床時間から入眠時間を引いただけです。これで睡眠時間をシリアル値で表せたことになります。

 

G列「睡眠時間(h)」

次のように入力しています: =F2*24

先述のように時刻シリアル値は24時間を0~1の小数で表したものなので、24をかければ単位がhourになります。これで表の完成です。

 

おまけ:平均睡眠時間を求める

平均睡眠時間は普通に =AVERAGE(G2:G5) とすれば求まります。ただし「分」の部分が10進法になっています。もし60進法に直したいなら、次のようにすれば「時間」と「分」の部分を分けることができます。

  • 「時間」を取り出す
     → 整数部分を取り出せばいいので、 ROUNDDOWN関数を使います。
  • 「分」を取り出す
     → MOD関数で小数部分を取り出し、60をかければ「分」になります。(MODの「除数」に、先ほどROUNDDOWNで取り出した整数部分を使います)

f:id:MshrOkn:20210827171451p:plain

ROUNDDOWN関数で整数部分を取り出す

f:id:MshrOkn:20210827171532p:plain

MOD関数で小数部分を取り出して60をかけて「分」にする

 

「秒」も同じ要領で取り出せます(ROUNDDOWN関数で整数部分「分」を取り出し、さらにMOD関数で取り出した小数部分に60をかける)。

 

ありがとうExcel、ありがとうMicrosoft