2013-03-08 2 views
1

При разборе файлов данных у меня есть секунд, как эти:уменьшить точность времени временных рядов в миллисекундах

1.296999421 

который в настоящее время отображается в панд, как это:

<Timestamp: 2011-04-16 00:00:01.296999> 

с DTYPE из ' datetime64 [ns] ' , но я знаю, что исходное измерение имело только миллисекундную точность.

Возможно ли создать тайм-аут pandas, который использует только миллисекунду точности? Одна из моих целей - точно объединить различные таймсерии на основе их миллисекундных счетчиков.

Так что я хотел бы иметь только

<Timestamp: 2011-04-16 00:00:01.297> 

так, что я могу соответствовать этому времени штампа точно в другом временном ряде.

Другими словами, существует ли «datetime [ms]» и как я могу преобразовать в него несекретные временные метки?

ответ

2

решение HYRY является правильным, но панды не будет знать, как справиться с этим

с использованием новейших панды 0.11-DEV, timedeltas теперь полная поддержка

http://pandas.pydata.org/pandas-docs/dev/timeseries.html#time-deltas

In [25]: a = np.random.rand(8)*10 

In [26]: a.sort() 

In [27]: a 
Out[27]: 
array([ 0.72062151, 1.02039858, 2.07877837, 3.94256869, 5.5139672 , 
    6.80194715, 6.83050498, 8.63027672]) 

# trick is to pass a nanosecond value directly 
# pandas keeps all values internally as timedelta64[ns] 
In [5]: pd.Series((np.round(a*1000)/1000)*1e9,dtype='timedelta64[ns]') 
Out[5]: 
0 00:00:00.721000 
1 00:00:01.020000 
2 00:00:02.079000 
3 00:00:03.943000 
4 00:00:05.514000 
5 00:00:06.802000 
6 00:00:06.831000 
7 00:00:08.630000 
dtype: timedelta64[ns] 

И если вам нужно это как временную метку

In [8]: pd.Series((np.round(a*1000)/1000)*1e9,dtype='timedelta64[ns]') + pd.Timestamp('20110406') 
Out[8]: 
0 2011-04-06 00:00:00.721000 
1 2011-04-06 00:00:01.020000 
2 2011-04-06 00:00:02.079000 
3 2011-04-06 00:00:03.943000 
4 2011-04-06 00:00:05.514000 
5 2011-04-06 00:00:06.802000 
6 2011-04-06 00:00:06.831000 
7 2011-04-06 00:00:08.630000 
dtype: datetime64[ns] 
+0

Итак, я подумал, что лучше оставить Джеффа наедине со всеми моими проблемами в таймсере. Вы не можете сказать, что я не пытался! ;) –

+0

У меня теперь проблема, что 'pd.io.date_converters.parse_all_fields()' не нравится timedeltas как вход? У вас есть идея? –

+0

Итак, если внутри он хранится как 64-битный поплавок, могу ли я когда-либо быть уверенным в возможности проверить равенство между этими метками времени? Было бы лучше подойти к чему-то, используя np.allclose() или, по крайней мере, тест, который учитывает epsilon-ошибку, а не равенство? Я надеялся достичь равнозначного равенства, перейдя к миллисекундам. –

1

Я не знаю, как вы конвертируете 1.296999421 в <Timestamp: 2011-04-16 00:00:01.296999>. Я думаю, что вы можете создать datetime64 [мс] массив по следующему шагу:

a = np.random.rand(100)*10 
a.sort() 
t = np.array(np.round(a*1000), dtype="timedelta64[ms]") + np.datetime64("2012-03-01") 

Затем вы можете использовать t как индекс вашего DataFrame. Pandas преобразует это значение в timedelta64[ns].

+0

очевидно, что невозможно преобразовать 1.296 99xxxx до этой полной отметки времени, это был всего лишь пример, потому что я занимаюсь секундным лечением. –

Смежные вопросы