Python:将两行DateTimeIndex移动半小时

Python:将两行DateTimeIndex移动半小时,python,datetime,pandas,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-1

我有一个数据帧,使用半小时分辨率的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\u剪贴板加载上述内容(index\u col=0,parse\u dates=True,sep=',')


我曾尝试将df['2014-11-05 03:00:00'].shift(perfiods=1,freq='-60Min')合并到一起,但没有多少乐趣,也不确定如何最好地继续进行。感觉这应该很简单,但有点困难。

为了便于讨论,假设您不知道在哪里发生这种情况,或者无法编辑源文件。这里有一种方法可以做到这一点:

In[1]: df = pd.read_clipboard(index_col=0, parse_dates=True, sep=',')
现在,我们将把索引转换为
pd.Series
,因为
index
不支持项目分配

我们将使用参数
keep='last'
duplicated()
:出现多次的第一个事件将移动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
假设您没有遇到时间戳重复超过两次的情况,上述方法就可以了


另一种选择是完全覆盖索引,如果您知道这是一个恒定的30分钟间隔:

df.index = pd.date_range(start=df.index.min(), periods=len(df), freq='30Min')

为了便于讨论,假设您不知道在哪里发生这种情况,或者无法编辑源文件。这里有一种方法可以做到这一点:

In[1]: df = pd.read_clipboard(index_col=0, parse_dates=True, sep=',')
现在,我们将把索引转换为
pd.Series
,因为
index
不支持项目分配

我们将使用参数
keep='last'
duplicated()
:出现多次的第一个事件将移动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
假设您没有遇到时间戳重复超过两次的情况,上述方法就可以了


另一种选择是完全覆盖索引,如果您知道这是一个恒定的30分钟间隔:

df.index = pd.date_range(start=df.index.min(), periods=len(df), freq='30Min')

你能用正确的值替换错误的值吗?如果我是你,我甚至会在Excel表中这样做……我最终这样做了,但据我所知,由于某种原因,我最终得到的很多数据都会有类似的错误,所以想用一种方法来cehck并在发生错误时对其进行修改。你能用正确的值?如果我是你,我甚至会在Excel表中这样做…我最终这样做了,但据我所知,我最终得到的很多数据由于某种原因会有类似的错误,所以希望有一种方法来cehck并修改它,如果它碰巧提供帮助,欢迎使用Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。很乐意提供帮助,欢迎使用Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。