【问题标题】:Rounding Pandas Timestamp to minutes将 Pandas 时间戳四舍五入到分钟
【发布时间】:2015-01-17 19:36:10
【问题描述】:

我想基于pd_date_range() 的开始和结束时间戳(自纪元以来以微秒为单位)以 1 分钟的间隔创建一个DateTimeIndex。为此,我需要将开始时间戳向上取整,将结束时间戳向下取整。这是我目前所拥有的:

import pandas as pd
start = 1406507532491431
end = 1406535228420914

start_ts = pd.to_datetime(start, unit='us') # Timestamp('2014-07-28 00:32:12.491431')
end_ts = pd.to_datetime(end, unit='us') # Timestamp('2014-07-28 08:13:48.420914')

我要四舍五入:

start_tsTimestamp('2014-07-28 00:32')

end_tsTimestamp('2014-07-28 08:14')

我该怎么做?

【问题讨论】:

  • 你期待什么输出?

标签: python pandas


【解决方案1】:

data.index.round('60S')

大约 60 秒。

【讨论】:

    【解决方案2】:

    从 0.18 版本开始,Pandas 内置了datetime-like rounding functionality

    start_ts.round('min')  # Timestamp('2014-07-28 00:32:00')
    end_ts.round('min')    # Timestamp('2014-07-28 08:14:00')
    

    如果您需要强制向上或向下舍入,也可以使用.ceil.floor


    编辑: 根据 OP 的要求,上述代码适用于原始 pd.Timestamp。如果您使用的是pd.Series,请使用dt 访问器:

    s = pd.Series(pd.to_datetime([1406507532491431000, 1406535228420914000]))
    s.dt.round('min')
    

    输出:

    0   2014-07-28 00:32:00
    1   2014-07-28 08:14:00
    dtype: datetime64[ns]
    

    【讨论】:

    • 天啊!它就像魅力一样!但是你必须使用“dt”访问器。 df.ts.dt.round('5 分钟')
    【解决方案3】:

    正如@user3735204 所说,可以使用以下内容对列进行四舍五入:

    df['datecol'] = df['datecol'].astype('datetime64[m]')
    

    方括号中的单位可以是:

    Y[ear] M[month] D[ay], h[our], m[inute], s[econd]
    

    还可以通过将列设为索引并应用 round 方法(在 pandas 0.19.0 中可用)来四舍五入到最近的 (reference):

    df.index = pd.to_datetime(df['datecol'])
    df.index = df.index.round("S")
    

    示例:

    df = pd.DataFrame(data = tmpdata)
    df['datecol'] = df['datecol'].astype('datetime64[s]')
    print df['datecol']
    
    0   2016-10-05 05:37:42
    1   2016-10-05 05:37:43
    Name: datecol, dtype: datetime64[ns]
    
    df.index = pd.to_datetime(df['datecol'])
    df.index = df.index.round("S")
    
    print df.index
    
    DatetimeIndex(['2016-10-05 05:37:43', '2016-10-05 05:37:43'], dtype='datetime64[ns]', name=u'timestamp', freq=None)
    

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,想结束这一天。原来有一个简单的方法(它适用于 Y[ear] M[month] D[ay]、h[our]、m[inute]、s[econd])。假设 df 是一个带有“datecol”列的 pandas DataFrame:

      df['datecol'] = df['datecol'].values.astype('<M8[m]')
      

      将它四舍五入到 m[inute]。鉴于我最初发现了这个问题,我想我会链接回我得到的答案,因为它似乎相关,

      More efficient way to round to day timestamps using pandas

      【讨论】:

        【解决方案5】:

        用一种简单的方法做到这一点目前是一个悬而未决的问题here

        In [22]: start = 1406507532491431
        
        In [23]: end = 1406535228420914
        
        [26]: dti = pd.to_datetime([start,end],unit='us')
        
        In [27]: dti
        Out[27]: 
        <class 'pandas.tseries.index.DatetimeIndex'>
        [2014-07-28 00:32:12.491431, 2014-07-28 08:13:48.420914]
        Length: 2, Freq: None, Timezone: None
        
        In [29]: pd.DatetimeIndex(((dti.asi8/(1e9*60)).round()*1e9*60).astype(np.int64))
        Out[29]: 
        <class 'pandas.tseries.index.DatetimeIndex'>
        [2014-07-28 00:32:00, 2014-07-28 08:14:00]
        Length: 2, Freq: None, Timezone: None
        

        尽管如此,它非常简单。

        欢迎请求实施。

        【讨论】:

        【解决方案6】:
        import pandas as pd
        new_index = pd.date_range(start=start_ts.strftime('%Y-%m-%d %H:%M'), end=end_ts.strftime('%Y-%m-%d %H:%M'), freq='1min')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-22
          • 2014-08-20
          • 2020-03-23
          • 2013-10-17
          • 2017-07-25
          • 2018-06-03
          • 2016-04-27
          • 2017-12-02
          相关资源
          最近更新 更多