Python Pandas:将两行DateTimeIndex移动半小时

时间:2016-11-28 00:53:01

标签: python datetime pandas

我有一个使用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'),但没有太多的快乐,也不确定如何最好地继续这一点。感觉这应该是简单的,但打了一个砖墙。

1 个答案:

答案 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')