代わりに、use SQLite's own built in date and time functions。 Unixのエポックタイムはatime
のようです。
update hash set atime = datetime(atime, 'unixepoch', 'localtime');
しかし、あなたはおそらくローカルタイムゾーンで日付を格納する必要はありません。タイムゾーンが複雑になり、夏時間が失われて重複している...涙が出るだけです。間違いなく、そのタイムゾーンが何であるかを明示せずに、ローカルタイムゾーンにdatetimeを格納することは望ましくありません。
本当に良い理由がない限り、UTCとして保存してください。一般的に
update hash set atime = datetime(atime, 'unixepoch');
、あなたはSQLiteのは、サポートされていないもの、は、ユーザー定義関数を作成し、クエリで使用をしたい場合。これは、組み込みSQLite関数を使用するより効率的ではありませんが、選択、変換、および更新よりも効率的です。
このようになります。
def epoch_to_iso8601(epoch):
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime((float(epoch))))
con.create_function("epoch_to_iso8601", 1, epoch_to_iso8601)
次に、epoch_to_iso8601
をクエリに使用できます。
update hash set atime = epoch_to_iso8601(atime);
これはストアドプロシージャと同じではありません。 SQLiteサーバーがないので、すべてのコードがプロセス内で実行されています。この関数はプロセスごとです。
sqlite3.create_functionを参照してください。
ここでの本当の問題は、あなたが、文字列として日付時刻を保存しているです。これにより、彼らは遅くて扱いにくいものになります。つまり、1つの書式を選択する必要があります。つまり、そのフォーマットを解析して何かを行う必要があるということです。つまり、組み込みのSQLiteの日付と時刻関数(疎である)を使用することはできません。
あなたが実際にやりたいことは、atime
をUnixのエポックタイムとして残し、必要に応じてそれをフォーマットします。
select datetime(atime, 'unixepoch') from hash;
幸いSQLiteはそのタイプで非常にloosey-gooseyであり、それは、パフォーマンスとストレージのペナルティが発生しますが、あなたのための番号にテキストatime
フィールドを変換します。
理想的には、datetime
タイプを使用するようにatime
を変更したいと思いますが、これはSQLiteのでは困難です。既存の列の削除または変更はサポートされていません。代わりに、テーブルにデータをダンプし、テーブルを再作成し、データをインポートする必要があります。これはわずか30,000レコードで非常に高速になるはずです。
CSVモードに切り替え、出力をファイルに送信し、すべてを選択します。
sqlite> .mode csv hash
sqlite> .output hash.out
sqlite> select * from hash;
既存のテーブルを削除し、同じですが、datetime
としてatime
でそれを再作成します。
sqlite> drop table hash;
sqlite> create table hash (atime datetime, and the other columns);
ダンプをインポートします。
sqlite> .import hash.out hash
これは、任意の変更を行うん:https://sqlite.org/pragma.html#pragma_synchronous –
デシベルファイルがどのくらいありますか?あなたはそれをすべてpandasにインポートし、操作してsqliteにエクスポートしようとするかもしれません。 – rshield
フィールドがインデックスに登録されていない可能性がありますか? – asiviero