我有一个用三个 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 round 函数实现吗?关于四舍五入 Pandas 时间戳的任何其他建议?
我正在使用 Pandas 0.23.1
最佳答案
我想像下面那样清理你的代码,它不会混合抽象级别并且更容易测试,希望也更具可读性:
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
标签转换为分钟数?
关于python - 将 Pandas 时间戳四舍五入到最接近的 10 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50903916/