汇总熊猫时间戳

时间:2018-08-24 04:47:09

标签: python pandas

我有一个熊猫时间戳列表。它应该分开15颗薄荷糖,但是由于测量中的某些错误,几分钟内可能会出现错误。

我想将时间戳取整到下一个最近的15分钟。

我知道我可以在熊猫中使用Timestamp.round()来环绕时间戳。但问题在于它会四舍五入到最接近的15个薄荷糖。我总是想舍入到下一个15分钟。

例如,

如果我有以下时间戳记,

ts = pd.Timestamp('2017-12-31 23:50:00+0530')

rounded = ts.round(freq='15T')

我得到的结果是Timestamp('2017-12-31 23:45:00+0530', tz='pytz.FixedOffset(330)')

我不希望这种情况发生,我希望结果是下一个15分钟的时间戳,即必须是

Timestamp('2018-01-01 00:00:00+0530', tz='pytz.FixedOffset(330)')

同时,我将具有以下形式的时间戳

Timestamp('2018-01-01 00:00:00+0530', tz='pytz.FixedOffset(330)')

如果我将Timestamp.ceil用于我的目的,我将得到这样的输出

Timestamp('2018-01-01 00:15:00+0530', tz='pytz.FixedOffset(330)')

我不希望它发生。

输出必须为

 Timestamp('2018-01-01 00:00:00+0530', tz='pytz.FixedOffset(330)')

简而言之,如果时间戳是正确的,则无需进行任何加密,如果时间戳不是15分钟,则必须将其封顶。

我如何轻松地对熊猫进行此操作?

4 个答案:

答案 0 :(得分:4)

您要ceil,而不是round

ts.ceil(freq='15T')

Timestamp('2018-01-01 00:00:00+0530', tz='pytz.FixedOffset(330)')

答案 1 :(得分:4)

我认为需要if-else

ts = pd.Timestamp('2018-01-01 00:00:00+0530')

print (ts.ceil(freq='15T') if ts.strftime('%H:%M:%S') != '00:00:00' 
                           else ts)
2018-01-01 00:00:00+05:30

from datetime import time

print (ts.ceil(freq='15T') if ts.time() != time(0,0,0)  else ts)
2018-01-01 00:00:00+05:30

答案 2 :(得分:2)

@jazrael发布的解决方案很棒,并且适用于基本情况。这也很好,因此我可以通过提供每小时15分钟的时间戳列表来扩展我想要的每个小时。它需要列出96个元素,并在下面显示的代码中进行检查。

from datetime import time

ts = pd.Timestamp('2018-01-01 00:00:00+0530')

print (ts.ceil(freq='15T') if ts.strftime('%H:%M:%S') != [list of 15 mints timestamps]
                           else ts)

我生成了所需时间的列表,并进行了这样的检查。

from datetime import time, timedelta
import numpy

ts = pd.Timestamp('2018-01-01 12:15:00')

print(ts.ceil(freq='15T') if ts.strftime('%H:%M:%S') not in [x.strftime('%H:%M:%S') for x in pd.date_range(start=pd.Timestamp('2018-01-01 00:00:00'), end=pd.Timestamp('2018-01-01 23:45:00'), freq='15T')]
      else ts)

答案 3 :(得分:1)

 import pandas as pd

    ts = pd.Timestamp('2017-12-31 23:50:00+0530')
    ceil = ts.ceil(freq='15T')
    print(ceil)
  

2018-01-01 00:00:00 + 05:30

Timestamp.ceil()返回为此分辨率设置的新时间戳,link here

Timestamp.floor()返回以该分辨率为底限的新时间戳link here