我有一个熊猫时间戳列表。它应该分开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分钟,则必须将其封顶。
我如何轻松地对熊猫进行此操作?
答案 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)