2017-03-27 6 views
1

私はdatetime.time文字列をpythonの総マイクロ秒に等しい整数に変換しようとしています。epochからμに時間文字列を格納

# my input 
>>> mark_raw = '00:01:00.420000' # 0 hr, 1 min, 0 sec, 42 ms 

# my desired output 
>>> mark_time 
60420000 

私の現在の計画では、エポック

# 0 hr, 1 min, 0 sec, 42 ms 
>>> mark_raw = '00:01:00.420000' 
>>> mark_dt = datetime.strptime(mark_raw, '%H:%M:%S.%f') 

>>> mark_dt 
datetime.datetime(1900, 1, 1, 0, 1, 0, 420000) 

>>> mark_date = mark_dt.date() 
>>> mark_date 
datetime.date(1900, 1, 1) 

>>> dt_epoch = calendar.timegm(mark_dt.timetuple()) * 1000 
>>> dt_epoch 
-2208988740000 

>>> date_epoch = calendar.timegm(mark_date.timetuple()) * 1000 
>>> date_epoch 
-2208988800000 

>>> mark_time = dt_epoch - date_epoch 
>>> mark_time 
60000 

ないのはなぜ私は60000マイクロ秒を取得していてください以来のエポックからの日時、および日付の違いを見つけます。たぶん丸め問題?私はdatetime.date(1900, 1, 1)datetime.date(1900, 1, 1, 0, 0, 0, 0)と等しいと仮定していますが、多分それはそうではありません。

唯一の要件は、マイクロ秒に元の時間文字列を取得することです。これは他の戦略にも役立ちます。

答えて

2

不一致の理由は、あなたがここでの違いを見ることができ、

>>> mark_dt.timetuple() 
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=1, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1) 
>>> mark_date.timetuple() 
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1) 

です! mark_dt.timetuple()tm_min=1tm_min=0mark_date.timetuple()

INと、

dt_epoch = calendar.timegm(mark_dt.timetuple()) 
print dt_epoch 

date_epoch = calendar.timegm(mark_date.timetuple()) 
print date_epoch 

mark_time = dt_epoch - date_epoch 
print mark_time 

、それによって二つの結果でtm_min = 1と0の差を反映

-2208988740 
-2208988800 
60 

を印刷します!

マイクロ

を取得し、あなたは彼がマイクロ秒を取得したい場合は、エポックからはtimedeltaを取得し、total_secondsを見つけ、そして10^-6で

# 0 hr, 1 min, 0 sec, 42 ms 
import datetime 
import calendar 
mark_raw = '00:01:00.420000' 
mark_dt = datetime.datetime.strptime(mark_raw, '%H:%M:%S.%f') 

mark_date = mark_dt.date() 
epoch_datetime=datetime.datetime(
    year=mark_date.year, 
    month=mark_date.month, 
    day=mark_date.day, 
) 
print (mark_dt - epoch_datetime).total_seconds()*(1000000) 
#print (mark_dt - epoch_datetime).total_seconds()*ie6 
を1E6していることを乗算します

出力:

60420000.0 

はそれが役に立てば幸い!

0

あなたは.timestamp()calendar.timegmを変更することができます。

>>> calendar.timegm(mark_dt.timetuple()) * 1000 
-2208988740000 
>>> mark_dt.timestamp() * 1000 
-2208988739.58 

日時でのラウンド問題の理由は、既にKeerthanaの答えによって説明されます。

関連する問題