我有一个使用DateTimeIndex的数据帧,半小时分辨率。数据在两个时间戳中出错,其中小时值错误,需要在1小时后移位
正在从创建者确认为错误的Excel工作表中读取数据。基本上第一个03:00和03:30的时间戳应该转移到02:00和02:30
DateTime,Results
2014-11-05 01:00:00,135
2014-11-05 01:30:00,125
2014-11-05 03:00:00,158
2014-11-05 03:30:00,565
2014-11-05 03:00:00,684
2014-11-05 03:30:00,474
您可以使用df = pd.read_clipboard(index_col=0, parse_dates=True, sep=',')
加载上述内容。
我尝试合并df['2014-11-05 03:00:00'].shift(perfiods=1,freq='-60Min')
,但没有太多的快乐,也不确定如何最好地继续这一点。感觉这应该是简单的,但打了一个砖墙。
答案 0 :(得分:0)
为了论证,假设您处于不知道发生的位置或无法编辑源文件的情况。这是一种可以做到这一点的方法:
In[1]: df = pd.read_clipboard(index_col=0, parse_dates=True, sep=',')
现在,我们会将索引转换为pd.Series
,因为index
不支持项目分配。
我们将duplicated()
与参数keep='last'
一起使用:出现多次的事物的第一次出现将被移动60分钟:
In [2]:
s = pd.Series(df.index)
s[s.duplicated(keep='last')] = s[s.duplicated(keep='last')] + pd.Timedelta('-60Min')
df.index = s
df
Out[2]:
Results
DateTime
2014-11-05 01:00:00 135
2014-11-05 01:30:00 125
2014-11-05 02:00:00 158
2014-11-05 02:30:00 565
2014-11-05 03:00:00 684
2014-11-05 03:30:00 474
如果您没有遇到时间戳重复两次以上的情况,上述情况会正常工作。
另一个选择是使用pd.date_range
完全覆盖索引,如果你知道它是一个恒定的30分钟间隔的事实:
df.index = pd.date_range(start=df.index.min(), periods=len(df), freq='30Min')