2017-07-28 7 views
0

mongoDBに格納されたデータを受け取り、bson.json_util.dumps()関数を介してJSONとしてエクスポートしました。それを日時オブジェクトに戻すことを試みるとき、通常のパーサのどれも動作しません。python:unix/posixのエポックタイムスタンプをdatetimeに変換する(monogdb、date_util jsonエクスポート後)

{ 
u'_group': 0, 
u'_range': u'', 
u'canon': 0, 
u'comment_id': 0, 
u'created': {u'$date': 1491468607000L}, 
u'description': u'' 
} 

とすべての日付は、次のようになります:ここではサンプルです

[{u'$date': 1491457629000L}, {u'$date': 1491458993000L}, {u'$date': 1491457072000L}, {u'$date': 1491457035000L}, {u'$date': 1491457330000L}, {u'$date': 1491458323000L}, {u'$date': 1491458147000L}, {u'$date': 1491458277000L}, {u'$date': 1491459839000L}, {u'$date': 1491466340000L}, {u'$date': 1491463804000L}, {u'$date': 1491464304000L}, {u'$date': 1491465145000L}, {u'$date': 1492073749000L}, {u'$date': 1492073750000L}, {u'$date': 1492075415000L}, {u'$date': 1492155813000L}, {u'$date': 1492608582000L}, {u'$date': 1492671698000L}, {u'$date': 1493001047000L}, {u'$date': 1493714117000L}] 

私のテスト:

y = {u'$date': 1491457629000L} 
>>> y['$date'] 
1491457629000L 

、様々な試みが失敗した:

print(
    datetime.datetime.fromtimestamp(
     y['$date'] 
    ).strftime('%Y-%m-%d %H:%M:%S') 
) 

ValueError: timestamp out of range for platform localtime()/gmtime() function

from dateutil import parser 
parser.parse(str(y['$date'])) 

OverflowError: Python int too large to convert to C long

utc_time = datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=y['$date']) 

OverflowError: date value out of range

任意のUNIXタイムスタンプコンバータは、これを読むことができなければならないようです。なぜそれは働いていないのですか?私も年と月だけが必要なので、タイムゾーンの特異性は私の要求の範囲外です。

注:ここでの解決策は、関連のないタイムスタンプで再フォーマットするのではなく、mongodbから変換された方法を反映する別のJSONパーサーを使用することだったので、converting epoch time with milliseconds to datetimeの複製ではありません。パーサ。私はすでに他のリンクを調べて、それが私の問題を解決していないことを発見しました。

+0

[エポックタイムをミリ秒でdatetimeに変換]の可能な複製(https://stackoverflow.com/questions/21787496/converting-epoch-time-with-milliseconds-to-datetime) –

+0

タイムゾーンは重要です、btw。例:タイムスタンプの値が「2017-12-31T23:00Z」に対応する場合、年と月は、タイムゾーンに応じて、2017年12月または2018年1月のいずれかになります。実際には、月の最初または最後の日付は、タイムゾーンによって月の値が異なります。もちろん、システムのデフォルトのタイムゾーン(または特定のタイムゾーン)を常に使用すると想定できます。それでも、それはあなたが考慮する必要があるものです。 –

答えて

0

これは機能しました。私は、この特定のタイムスタンプ形式は、他のツールで変換しない理由、

{u'$date': 1491457629000L} 

を知っているが、独自の対応json_util.loads()方法作品とjson_util.dumps()方法を逆にしないでください。 datetimeオブジェクトを生成

from bson import json_util 
import requests 
raw = requests.get('someurlhere') 
data = json_util.loads(raw.text) 
    {... 
    u'created': datetime.datetime(2017, 4, 6, 5, 47, 9, tzinfo=<bson.tz_util.FixedOffset object at 0x0000000002FAAC18>), 
...} 

をし、私はそれで動作することができます:それは、代わりにPythonのrequestsモジュールに標準.json()メソッドを使用しての要求されたデータにそれを行う必要があります。

0

最後の3つのゼロ(1000で割って)を削除しようとしましたか?

エラーは変換から来ているようですが、値はおそらくミリ秒単位ですが、Python datetime.datetime.fromtimestampは秒がかかると予想しています。

関連する問題