テーブルはFreq0
とFreq1
イベントID
の発生を示し、次のSQLで文字列をシフトする方法は?
ID | Freq0 | Freq1 | is_overnight | start_time | end_time |
---------------------------------------------------------------------------
1 | _23_5_7 | _2____7 | Y | 1:00 | 3:00 |
2 | 1_____7 | 1______ | N | 5:00 | 7:00 |
3 | _2__5__ | _2_____ | N | 23:00 | 1:00 |
のように見えると仮定します。たとえば、Freq0 = 1_____7
は、イベントが月曜日と日曜日に発生することを意味します。また、Freq0
とFreq1
はともにvarchar(7)
です。 is_overnight = Y or start_time > end_time
場合
修正ロジックがあり、Freq0
とFreq1
両方がそうでない変化がない、右にシフトする必要があります。
右シフトの例は、上記の表に、このロジックを適用
_23_5_7 => 1_34_6_
1_____7 => 12_____
_2__5__ => __3__6_
あり、我々は次のような結果
ID | Freq0 | Freq1 | is_overnight | start_time | end_time |
---------------------------------------------------------------------------
1 | 1_34_6_ | 1_3____ | Y | 1:00 | 3:00 |
2 | 1_____7 | 1______ | N | 5:00 | 7:00 |
3 | __3__6_ | __3____ | N | 23:00 | 1:00 |
を得ることになっている私が通りPython
を使用してこのタスクを完了することができました次のとおりです。
def right_shift(column_name):
def helper(raw_data):
content = raw_data[column_name]
if raw_data['is_overnight '] == 'Y' or raw_data['start_time '] > raw_data['end_time ']:
content = content[-1] + content[:-1]
content = [str(index + 1) if content[index] != '_' else '_' for index in range(len(content))]
return "".join(content)
else:
return content
return helper
raw_data = pd.read_sql(sql_query, connection)
raw_data['Freq0'] = raw_data.apply(right_shift('Freq0'), axis = 1)
raw_data['Freq1'] = raw_data.apply(right_shift('Freq1'), axis = 1)
しかし、 eこれはsqlで、これは私が困難なエレガントなコードの部分にそれを書くことに遭遇したときです。誰も私にここで手を差し伸べることはできますか?
を動作するようです。これらの周波数を別の表で正規化する。 –
@TT。詳細を教えてください。個人的には、ここでは正規化が問題だとは思わない。 –
新しくフォーマットされた文字列を返す関数を書くべきでしょう。文字の上に単純なループで簡単に行う必要があります。 – SQLAndOtherStuffGuy