【问题标题】:reduce time precision of time series to milliseconds将时间序列的时间精度降低到毫秒
【发布时间】:2013-02-23 14:43:57
【问题描述】:

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

1.296999421

目前在 pandas 中显示如下:

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

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

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

所以我只想拥有一个

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

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

换句话说,是否存在“日期时间[ms]”以及如何将非顺序时间戳转换为它?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    HYRY的解决方案是对的,但是pandas不知道怎么处理

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

    【讨论】:

    • 所以我在想,我最好让 Jeff 独自处理我所有的时间序列问题。你不能说我没有尝试! ;)
    • 我现在有pd.io.date_converters.parse_all_fields()不喜欢timedeltas作为输入的问题?你对此有什么想法吗?
    • 那么,如果在内部它无论如何都保持为 64 位浮点数,我真的可以确定能够测试这些时间戳之间的相等性吗?更好的方法是使用 np.allclose() 或者至少是一个考虑 epsilon 错误而不是相等的测试?我希望通过毫秒来实现可测试的平等。
    • 没有看到您的署名!如果你愿意,你可以做 td.astype('int') ,但他们应该在任何情况下比较 == 因为它们在引擎盖下是 int64 (所以它们是 ns 的确切数字)
    • 不了解解析器,可能未更新以处理 timedeltas....您可以存储开始日期和结束日期或 int64
    【解决方案2】:

    我不知道你如何将1.296999421 转换为&lt;Timestamp: 2011-04-16 00:00:01.296999&gt;。我认为您可以通过以下步骤创建一个 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 的索引。 Pandas 会将其转换为timedelta64[ns]。

    【讨论】:

    • 显然无法将 1.29699xxxx 转换为完整时间戳,这只是一个示例,因为我关心的是秒处理。
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 2018-03-10
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多