将时间序列的时间精度降低到毫秒

时间:2013-03-08 05:43:31

标签: python pandas

在解析数据文件时,我有几秒钟:

1.296999421

目前正在像这样的pandas中显示:

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

dtype为'datetime64 [ns]' 但我知道原始测量只有毫秒精度。

是否可以生成仅使用毫秒精度的pandas时间序列? 我的目标之一是根据毫秒计数器精确加入不同的时间序列。

所以我想只有

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

这样我就可以在其他时间序列中精确匹配这个时间戳。

换句话说,是否有'datetime [ms]'以及如何将非顺序时间戳转换为它?

2 个答案:

答案 0 :(得分:2)

HYRY解决方案是对的,但是熊猫不会知道如何处理它

使用最新的pandas 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]

答案 1 :(得分:1)

我不知道您如何将1.296999421转换为<Timestamp: 2011-04-16 00:00:01.296999>。我想你可以通过以下步骤创建一个datetime64 [ms]数组:

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的索引。熊猫会将此转换为timedelta64[ns]