Python 熊猫:时间戳索引四舍五入到最接近的第5分钟
我有一个Python 熊猫:时间戳索引四舍五入到最接近的第5分钟,python,pandas,Python,Pandas,我有一个df,以通常的时间戳作为索引: 2011-04-01 09:30:00 2011-04-01 09:30:10 ... 2011-04-01 09:36:20 ... 2011-04-01 09:37:30 我如何为这个数据帧创建一个具有相同时间戳但四舍五入到最接近的5分钟间隔的列?像这样: index new_col 2011-04-01 09:30:00 2011-04-01 09:
df
,以通常的时间戳作为索引:
2011-04-01 09:30:00
2011-04-01 09:30:10
...
2011-04-01 09:36:20
...
2011-04-01 09:37:30
我如何为这个数据帧创建一个具有相同时间戳但四舍五入到最接近的5分钟间隔的列?像这样:
index new_col
2011-04-01 09:30:00 2011-04-01 09:35:00
2011-04-01 09:30:10 2011-04-01 09:35:00
2011-04-01 09:36:20 2011-04-01 09:40:00
2011-04-01 09:37:30 2011-04-01 09:40:00
您可以尝试以下方法:
def round_to_5min(t):
delta = datetime.timedelta(minutes=t.minute%5,
seconds=t.second,
microseconds=t.microsecond)
t -= delta
if delta > datetime.timedelta(0):
t += datetime.timedelta(minutes=5)
return t
df['new_col'] = df.index.map(round_to_5min)
是正确的,但复杂且非常缓慢。而是使用熊猫中的niceTimstamp
:
import numpy as np
import pandas as pd
ns5min=5*60*1000000000 # 5 minutes in nanoseconds
pd.to_datetime(((df.index.astype(np.int64) // ns5min + 1 ) * ns5min))
让我们比较一下速度:
rng = pd.date_range('1/1/2014', '1/2/2014', freq='S')
print len(rng)
# 86401
# ipython %timeit
%timeit pd.to_datetime(((rng.astype(np.int64) // ns5min + 1 ) * ns5min))
# 1000 loops, best of 3: 1.01 ms per loop
%timeit rng.map(round_to_5min)
# 1 loops, best of 3: 1.03 s per loop
大约快1000倍 我也有同样的问题,但是datetime64p[ns]时间戳 我用过:
def round_to_5min(t):
""" This function rounds a timedelta timestamp to the nearest 5-min mark"""
t = datetime.datetime(t.year, t.month, t.day, t.hour, t.minute - t.minute%5, 0)
return t
接着是“地图”功能可以很容易地使用熊猫的圆形功能
df["timestamp_column"].dt.round("5min")
查看更多细节,看起来不错,但当我在数据上测试时,我看到:
2011-04-01 09:32:10->2011-04-01 09:30:00
2011-04-01 09:32:20->2011-04-01 09:30:00
2011-04-01 09:32:30->2011-04-01 09:35:00
2011-04-04-01 09:35:00,在你的问题中,你提到了四舍五入到“最近的”5分钟,但我从你的数据中看到,你希望四舍五入到接下来的5分钟。我已经确定了答案,谢谢。我假设您希望9:30:00:00改为9:30:00:00,而不是9:35:00:00,否则您可以随时添加5分钟。您知道我如何从新的列表中选择小时和分钟吗?例如,我正在尝试这样做:datetime.datetime.hour(df.new\u-col)
这样我就可以有一个新的column只与hour一起使用,而这不是进行相同的操作:df['hour']=df.new\u-col.map(lambda t:t.hour)
非常感谢!我真的需要学习MAP的所有可能性。在处理夏时制时要小心:不是所有的日子都有相同的长度,你的方法可能会失败。我建议使用偏移量:@Marius-Ion:这里不需要小心。一天的长短无关紧要。如果DatetimeIndex具有时区,astype
操作将转换为UTC。只需将结果转换回您所在的时区即可(例如,使用tz_localize(“UTC”)。tz_convert(“US/Eastern”)
)注意,要将结果四舍五入到最接近的5分钟,而不是四舍五入,这会稍微复杂一些-也许值得将其添加到您的答案中?我把我的代码粘贴在这里,但显然它在答案中看起来会更好,因为注释没有格式:(******pd.to_datetime((rng.astype(np.int64)//ns5min)*ns5min)#向下取整+((rng.astype(np.int64)%ns5min)>(ns5min/2))*ns5min#如果需要,添加5min)这些答案中有许多更为贴切,您只需更改5分钟
即可代替15分钟
,这是最好的解决方案!