回答編集履歴

7

テキスト修正

2020/02/08 08:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -112,13 +112,13 @@
112
112
 
113
113
 
114
114
 
115
- - 所与のデータフレームの全行について、 `登録時刻`列の日時の日付部分を `1970-01-01` に置き換えた日時を作り、それらに対して `timestamp()` によってエポック秒を取得
115
+ 所与のデータフレームの全行について、 `登録時刻`列の日時の日付部分を `1970-01-01` に置き換えた日時を作り、それらに対して `timestamp()` によってエポック秒を取得
116
116
 
117
- - 上記で得られた、全行の秒数の平均値を算出
117
+ 上記で得られた、全行の秒数の平均値を算出
118
118
 
119
- - 上記で得られた平均値をエポック秒として日時を作る。
119
+ 上記で得られた平均値をエポック秒として日時を作る。
120
120
 
121
- - 上記で作成した日時の時刻部分が、求めたい平均としての時刻になる。
121
+ 上記で作成した日時の時刻部分が、求めたい平均としての時刻になる。
122
122
 
123
123
 
124
124
 
@@ -126,19 +126,21 @@
126
126
 
127
127
  ```python3
128
128
 
129
+
130
+
129
- timestamps = dfres['登録時刻'].apply(lambda dt: dt.replace(year=1970, month=1, day=1).timestamp())
131
+ timestamps = dfres['登録時刻'].apply(lambda dt: dt.replace(year=1970, month=1, day=1).timestamp()) # ①
130
132
 
131
133
 
132
134
 
133
- avg_timestamp = round(timestamps.mean())
135
+ avg_timestamp = round(timestamps.mean()) # ②
134
136
 
135
137
 
136
138
 
137
- avg_date = datetime.datetime.fromtimestamp(avg_timestamp).astimezone(datetime.timezone.utc)
139
+ avg_date = datetime.datetime.fromtimestamp(avg_timestamp).astimezone(datetime.timezone.utc) # ③
138
140
 
139
141
 
140
142
 
141
- print(avg_date.time())
143
+ print(avg_date.time()) # ④
142
144
 
143
145
  ```
144
146
 

6

テキスト修正

2020/02/08 08:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -126,15 +126,15 @@
126
126
 
127
127
  ```python3
128
128
 
129
- timestamps = [*map(lambda dt: dt.replace(year=1970, month=1, day=1).timestamp(), dfres['登録時刻'])]
129
+ timestamps = dfres['登録時刻'].apply(lambda dt: dt.replace(year=1970, month=1, day=1).timestamp())
130
130
 
131
131
 
132
132
 
133
- avg_second = round(np.mean(timestamps))
133
+ avg_timestamp = round(timestamps.mean())
134
134
 
135
135
 
136
136
 
137
- avg_date = datetime.datetime.fromtimestamp(avg_second).astimezone(datetime.timezone.utc)
137
+ avg_date = datetime.datetime.fromtimestamp(avg_timestamp).astimezone(datetime.timezone.utc)
138
138
 
139
139
 
140
140
 
@@ -144,4 +144,4 @@
144
144
 
145
145
 
146
146
 
147
- - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/teratail-Q2401532](https://repl.it/@jun68ykt/teratail-Q2401532)
147
+ - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/teratail-Q240153sample2](https://repl.it/@jun68ykt/teratail-Q240153sample2)

5

テキスト修正

2020/02/08 07:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -144,4 +144,4 @@
144
144
 
145
145
 
146
146
 
147
- - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/teratail-Q240153_2](https://repl.it/@jun68ykt/teratail-Q2401532)
147
+ - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/teratail-Q2401532](https://repl.it/@jun68ykt/teratail-Q2401532)

4

テキスト修正

2020/02/08 07:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -116,7 +116,9 @@
116
116
 
117
117
  - 上記で得られた、全行の秒数の平均値を算出
118
118
 
119
+ - 上記で得られた平均値をエポック秒として日時を作る。
120
+
119
- - 上記で得られ平均値から日時を作れば、それの時刻部分が求めたい平均としての時刻になる。
121
+ - 上記で作成した日時の時刻部分が求めたい平均としての時刻になる。
120
122
 
121
123
 
122
124
 

3

テキスト修正

2020/02/08 06:59

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -112,11 +112,11 @@
112
112
 
113
113
 
114
114
 
115
- - 所与のデータフレームの全行について、 `登録時刻`列の日時の日付部分を `1970-01-01` に置き換えた日時を作り、それに対して `timestamp()` によってエポック秒を取得
115
+ - 所与のデータフレームの全行について、 `登録時刻`列の日時の日付部分を `1970-01-01` に置き換えた日時を作り、それに対して `timestamp()` によってエポック秒を取得
116
116
 
117
- - 上記によって得られた、全行のエポック秒の平均を算出
117
+ - 上記得られた、全行の秒の平均を算出
118
118
 
119
- - 上記で得たエポック秒の平均値から日時を作れば、それの時刻部分が求めたい平均の時刻になる。
119
+ - 上記で得られた平均値から日時を作れば、それの時刻部分が求めたい平均としての時刻になる。
120
120
 
121
121
 
122
122
 

2

テキスト修正

2020/02/08 06:55

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -95,3 +95,51 @@
95
95
 
96
96
 
97
97
  - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/teratail-Q240153](https://repl.it/@jun68ykt/teratail-Q240153)
98
+
99
+
100
+
101
+
102
+
103
+ ### 追記
104
+
105
+
106
+
107
+ 上記の回答コードは、補助的な関数の中で、`3600` や `60` という数字を使って、時刻オブジェクトと数値の変換を行っており、煩雑でした。これらを使わない方法を考えたので追記します。
108
+
109
+
110
+
111
+ 考え方としては、
112
+
113
+
114
+
115
+ - 所与のデータフレームの全行について、 `登録時刻`列の日時の日付部分を `1970-01-01` に置き換えた日時を作り、それに対して `timestamp()` によってエポック秒を取得
116
+
117
+ - 上記によって得られた、全行のエポック秒の平均を算出
118
+
119
+ - 上記で得たエポック秒の平均値から日時を作れば、それの時刻部分が求めたい平均の時刻になる。
120
+
121
+
122
+
123
+ 以下は上記の考え方によるコードです。
124
+
125
+ ```python3
126
+
127
+ timestamps = [*map(lambda dt: dt.replace(year=1970, month=1, day=1).timestamp(), dfres['登録時刻'])]
128
+
129
+
130
+
131
+ avg_second = round(np.mean(timestamps))
132
+
133
+
134
+
135
+ avg_date = datetime.datetime.fromtimestamp(avg_second).astimezone(datetime.timezone.utc)
136
+
137
+
138
+
139
+ print(avg_date.time())
140
+
141
+ ```
142
+
143
+
144
+
145
+ - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/teratail-Q240153_2](https://repl.it/@jun68ykt/teratail-Q2401532)

1

テキスト修正

2020/02/08 06:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -36,17 +36,17 @@
36
36
 
37
37
 
38
38
 
39
- def time_to_sec(t):
39
+ def time_to_sec(dt):
40
40
 
41
41
  '''
42
42
 
43
- 引数 t で与えられるtimeオブジェクトの示す時、0時0分0秒から
43
+ 引数 dt で与えられるdatetimeオブジェクトの示す時の
44
44
 
45
- の経過秒数を返す
45
+ 時刻部分について、0時0分0秒からの経過秒数を返す
46
46
 
47
47
  '''
48
48
 
49
- return 3600 * t.hour + 60 * t.minute + t.second
49
+ return 3600 * dt.hour + 60 * dt.minute + dt.second
50
50
 
51
51
  ```
52
52
 
@@ -58,7 +58,7 @@
58
58
 
59
59
  ```python3
60
60
 
61
- dfres.loc[:,'時刻(秒)'] = [*map(lambda t: time_to_sec(t), dfres['登録時刻'].dt.time)]
61
+ dfres.loc[:,'時刻(秒)'] = [*map(lambda t: time_to_sec(t), dfres['登録時刻'])]
62
62
 
63
63
  ```
64
64
 
@@ -94,4 +94,4 @@
94
94
 
95
95
 
96
96
 
97
- - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/Q240153](https://repl.it/@jun68ykt/Q240153)
97
+ - 動作確認用 Repl.it: [https://repl.it/@jun68ykt/teratail-Q240153](https://repl.it/@jun68ykt/teratail-Q240153)