質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1483閲覧

strptimeでのパースがDocker上だとできない

imokurity

総合スコア297

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/09 02:11

仮想マシンのCentOS7だと以下のように正しくパースできるのですが、

[root@centos7-vm01 ~]# python Python 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from datetime import datetime >>> data_string = '3/19/19 4:35:00 PM JST' >>> format = '%m/%d/%y %I:%M:%S %p %Z' >>> datetime.strptime(data_string, format) datetime.datetime(2019, 3, 19, 16, 35) >>>

DockerコンテナのCentOS7だとパースエラーとなってしまいます。

[root@ed72b9566ecf app]# python Python 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from datetime import datetime >>> data_string = '3/19/19 4:35:00 PM JST' >>> format = '%m/%d/%y %I:%M:%S %p %Z' >>> datetime.strptime(data_string, format) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.7/_strptime.py", line 325, in _strptime (data_string, format)) ValueError: time data '3/19/19 4:35:00 PM JST' does not match format '%m/%d/%y %I:%M:%S %p %Z' >>>

何が原因と考えられるでしょうか。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/04/09 02:55

各マシンのシェル上で「timedatectl」コマンドを実行した結果を追記ください。
imokurity

2019/04/09 03:12

仮想マシン上は以下となりまして、 ``` Local time: Tue 2019-04-09 12:10:23 JST Universal time: Tue 2019-04-09 03:10:23 UTC RTC time: Tue 2019-04-09 03:10:23 Time zone: Asia/Tokyo (JST, +0900) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a ``` コンテナの方は、このようになりました。 ``` [root@e56381db4b00 app]# timedatectl Failed to create bus connection: No such file or directory ``` 時刻や、タイムゾーンに関する設定が必要な感じでしょうか。。
can110

2019/04/09 06:28

同じ情報を見つけられたようですね。 ちょうど今、こちらの環境での検証動作と合わせて回答しました。
guest

回答3

0

Dockerでのタイムゾーンの設定、の観点で行きますと、以下の解決方法もありそうでした。

これで問題となっていたコードも実行できました。

https://yoru9zine.hatenablog.com/entry/2017/01/12/224637

解決にご協力いただいたみなさま、ありがとうございました。

投稿2019/04/09 06:38

imokurity

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

当方環境でもタイムゾーンが未設定では~ JSTの解釈時に提示エラーが発生しました。
一方、入力文字列が~ UTCならエラーは発生しません。

ただしUTCまたはJSTで変換できたとしても、その結果のdatetime値は**タイムゾーン情報を持たない(native)**データであることに注意が必要です。
もしタイムゾーン情報を持つ(aware)データに変換したい場合は、pytzモジュールなりで自力で変換が必要なようです。
参考:Pythonで、pytzを使ったタイムゾーンの変換

以下検証コードです。

Python

1from datetime import datetime 2 3# タイムゾーン未設定な環境ではValueError: 4# タイムゾーン設定あり環境では2019-03-19 16:35:00 5print(datetime.strptime('3/19/19 4:35:00 PM JST', '%m/%d/%y %I:%M:%S %p %Z')) 6 7# どちらの環境でも2019-03-19 16:35:00 8print(datetime.strptime('3/19/19 4:35:00 PM UTC', '%m/%d/%y %I:%M:%S %p %Z')) 9 10# 上記の変換結果のdatetimeはいずれにせよタイムゾーン情報を持っていない(native)! 11 12# タイムゾーン情報を持たせる(aware)には… 13 14import pytz 15jst = pytz.timezone('Asia/Tokyo') 16 17native_dt = datetime.strptime('3/19/19 4:35:00 PM UTC', '%m/%d/%y %I:%M:%S %p %Z') 18print(native_dt)# 2019-03-19 16:35:00 19 20# native -> aware なデータに変換 21aware_dt = jst.localize(naive_dt) 22print(aware_dt) # 2019-03-19 16:35:00+09:00

このあたりの動きについて情報を探してみましたが、ジャストなものは見つからず、以下しか見つかりませんでした。
%Z in strptime doesn't match EST and others
strptimeでは%Zって無意味(使えない)んじゃないだろうか…

投稿2019/04/09 06:26

編集2019/04/09 06:32
can110

総合スコア38256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imokurity

2019/04/09 06:32

詳細に検証までしていただきまして、ありがとうございます!頂いた情報からうまいことやってみます。ありがとうございました。
guest

0

DocketコンテナだとJSTを扱えないのかもしれません。
JSTを自身で作成して、あとで変換するのはいかがでしょうか。
data_string中のJSTを自動判別する必要がある場合は、別の方法を考えなければなりませんが・・・

python

1>>> from datetime import datetime, timedelta, timezone 2>>> data_string = '3/19/19 4:35:00 PM JST' 3>>> format = '%m/%d/%y %I:%M:%S %p JST' 4>>> jst = timezone(timedelta(hours=+9), 'JST') 5>>> datetime.strptime(data_string, format).astimezone(jst) 6datetime.datetime(2019, 3, 19, 16, 35, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400), 'JST'))

投稿2019/04/09 03:43

編集2019/04/09 03:45
y.nakamura

総合スコア190

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imokurity

2019/04/09 06:32

ご回答ありがとうございます!いただいた方法も検討いたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問