我有一个空数据框,其中包含三个pandas时间戳:
import pandas as pd
ts1=pd.Timestamp('2017-06-01 00:05:00')
ts2=pd.Timestamp('2017-06-01 00:15:00')
ts3=pd.Timestamp('2017-06-01 00:25:00')
df=pd.DataFrame(index=[ts1, ts2, ts3])
现在我想将时间戳索引舍入到最近的10分钟:
df.index.round('10min')
但是我得到了一些意想不到的输出:
DatetimeIndex(['2017-06-01 00:00:00', '2017-06-01 00:20:00', '2017-06-01 00:20:00'], dtype='datetime64[ns]', freq=None)
请注意,2017-06-01 00:20:00
时间戳会出现两次。这是正确的行为吗?我想要的输出是:
DatetimeIndex(['2017-06-01 00:00:00', '2017-06-01 00:10:00', '2017-06-01 00:20:00'], dtype='datetime64[ns]', freq=None)
我可以使用熊猫圆功能实现这一目标吗?有关舍入熊猫时间戳的任何其他建议吗?
我使用pandas 0.23.1
答案 0 :(得分:1)
我想要清理你的代码,如下所示,它不会混合abstration的级别,并且更容易测试,希望也更具可读性:
import numpy as np
import pandas as pd
def is_exactly(x, minutes):
return np.abs(x) == pd.to_timedelta(minutes * 60,unit='S')
def round_timestamp(ts):
floor=ts.floor('10 min')
rounded=ts.round('10 min')
if is_exactly(rounded-ts, 5):
return floor
else:
return rounded
dt = pd.Timestamp('2017-01-01 00:15:00')
assert round_timestamp(dt) == pd.Timestamp('2017-01-01 00:10:00')
我自己,我很乐意了解频率10min
标记如何转换为分钟?
答案 1 :(得分:0)
我想出了一个函数,它以我需要舍入的方式舍入时间戳:
def rounding_timestamps(df):
import numpy as np
rounded_values_floor=df.index.floor('10min')
rounded_values=df.index.round('10min')
diff=np.abs(rounded_values-df.index)
output=rounded_values.values
I_floor=diff==pd.to_timedelta(300,unit='S') # 5min
output[I_floor] = rounded_values_floor[I_floor].values
return pd.to_datetime(output)
基本上我使用正常的舍入,但只要时间戳恰好是中途,就切换到地板舍入。
适合我,但我会感谢更优雅的解决方案。