10

人間が読める time をdatetimeobject に変換する作業を行っています。これを行うために、私は を使用していdatetime.datetime.strptimeます。

単純なことですが、私が持っている人間が読める時間には、解析できない分数が含まれています。これが定数であれば、フォーマットの一部として組み込むことができます。しかし、定数ではないので、そうすることができません。

これは私が今していることです:

>>> humanTime = '2012/06/10T16:36:20.509Z'
>>> datetime.datetime.strptime(humanTime, "%Y/%m/%dT%H:%M:%SZ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2012-06-10T16:36:20.507Z' does not match format '%Y-%m-%dT%H:%M:%SZ'

したがって、ここでの問題は、秒の端数が解析できないことだと思います。その一瞬のことは、私はあまり気にしません。文字列をスライスする以外datetimeに、秒の端数を無視するように依頼できる方法はありますか (できれば形式を使用して)。

非常に基本的なものが欠けているのではないかと感じています。助けていただければ幸いです。

4

3 に答える 3

8

1 秒未満のことはあまり気にしないので19、人間が読める文字列の最初の文字を取り出して、単純な形式を適用するだけで済みます。

>>> humanTime = '2012/06/10T16:36:20.509Z'
>>> datetime.datetime.strptime(humanTime[:19], "%Y/%m/%dT%H:%M:%S")
datetime.datetime(2012, 6, 10, 16, 36, 20)
于 2012-07-02T22:49:32.910 に答える
4

特定の問題の解決策: %f をマイクロ秒に使用します。

>>> datetime.datetime.strptime(humanTime, "%Y/%m/%dT%H:%M:%S.%fZ")

ただし、一般的なケースではまだ問題があります。ドットの後に 6 桁以上ある場合、この解決策は機能しません。

問題は、私の知る限り、datetime.datetime.strptime で受け入れられる形式には、一般に浮動秒が含まれていないことです。回避策は、datetime 変数を作成するときに秒を無視し、その後、datetime.timedelta で秒を追加することです。

>>> import numpy as np
>>> import datetime
>>> 
>>> humanTime = '2012/06/10T16:36:20.509Z'
>>> dt_time_no_seconds = datetime.datetime.strptime(humanTime[:-8], "%Y/%m/%dT%H:%M")
>>> seconds = np.float(humanTime[-7:-1])
>>> dt_time = dt_time_no_seconds+datetime.timedelta(seconds=seconds)
>>> dt_time_no_seconds
datetime.datetime(2012, 6, 10, 16, 36)
>>> dt_time
datetime.datetime(2012, 6, 10, 16, 36, 20, 509000)

お役に立てれば。

于 2014-05-17T11:52:05.273 に答える
2

ディレクティブ%fは小数秒を解釈します: https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

import datetime
humanTime = '2012/06/10T16:36:20.509Z'
datetime.datetime.strptime(humanTime, '%Y/%m/%dT%H:%M:%S.%fZ')
 
>> datetime.datetime(2012, 6, 10, 16, 36, 20, 509000)

Pandas は、小数秒で文字列を解析することもできます...

import pandas as pd
humanTime = '2012/06/10T16:36:20.509Z'
pd.to_datetime(humanTime)

>> Timestamp('2012-06-10 16:36:20.509000+0000', tz='UTC')
于 2018-05-29T15:15:42.503 に答える