Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将日期更改为数据框中的特定条目_Python_Pandas_Datetime_Dataframe - Fatal编程技术网

Python 将日期更改为数据框中的特定条目

Python 将日期更改为数据框中的特定条目,python,pandas,datetime,dataframe,Python,Pandas,Datetime,Dataframe,我在pandas中有一个数据帧,它在索引中有一个错误:23:00:00和23:59:59之间的每个条目都有一个错误的日期。我需要在这两次输入之间减去一天(即24小时) 我知道我可以获得这两次之间的条目,如df[df.hour==23],其中df是我的数据帧。但是,我是否可以仅为dataframe索引的那些特定条目修改日期 重置将花费我更多的时间,因为我的数据帧索引并非如下图所示等距排列(两个连续条目之间的步长为15分钟和30分钟)。从图中还应注意最后三个条目中的错误日期:应为2018-02-05

我在pandas中有一个数据帧,它在索引中有一个错误:23:00:00和23:59:59之间的每个条目都有一个错误的日期。我需要在这两次输入之间减去一天(即24小时)

我知道我可以获得这两次之间的条目,如
df[df.hour==23]
,其中
df
是我的数据帧。但是,我是否可以仅为dataframe索引的那些特定条目修改日期

重置将花费我更多的时间,因为我的数据帧索引并非如下图所示等距排列(两个连续条目之间的步长为15分钟和30分钟)。从图中还应注意最后三个条目中的错误日期:应为2018-02-05,而不是2018-02-06

我试着这么做

df[df.index.hour == 23].index.day = df[df.index.hour == 23].index.day - 1
但是我得到了属性错误:无法设置属性

样本数据:

2018-02-05 22:00:00    271.8000
2018-02-05 22:30:00    271.5600
2018-02-05 22:45:00    271.4400
2018-02-06 23:15:00    271.3750
2018-02-06 23:30:00    271.3425
2018-02-06 00:00:00    271.2700
2018-02-06 00:15:00    271.2300
2018-02-06 00:45:00    271.1500
2018-02-06 01:00:00    271.1475
2018-02-06 01:30:00    271.1425
2018-02-06 01:45:00    271.1400
预期产出:

2018-02-05 22:00:00    271.8000
2018-02-05 22:30:00    271.5600
2018-02-05 22:45:00    271.4400
2018-02-05 23:15:00    271.3750
2018-02-05 23:30:00    271.3425
2018-02-06 00:00:00    271.2700
2018-02-06 00:15:00    271.2300
2018-02-06 00:45:00    271.1500
2018-02-06 01:00:00    271.1475
2018-02-06 01:30:00    271.1425
2018-02-06 01:45:00    271.1400
你可以试试

如果您的数据帧有日期时间索引,您应该能够直接从中减去

df[df.hour==23]-pd.Timedelta('1天')

如果df.index type是string,则应首先更改类型,然后减去:
df.index=pd.to\u datetime(df.index)


df.index-pd.Timedelta('1天')

我自己通过使用解决了这个问题。这是我的代码:

as_list = df.index.tolist()
new_index = []
for idx,entry in enumerate(as_list):
    if entry.hour == 23:
        if entry.day != 1:            
            new_index.append(as_list[idx].replace(day = as_list[idx].day - 1))
        else:
            new_day = calendar.monthrange(as_list[idx].year, as_list[idx].month -1)[1]
            new_index.append(as_list[idx].replace(day = new_day, month = entry.month -1))
    else:
        new_index.append(entry)
df.index = new_index

请提供
code格式的
示例数据、您尝试过的内容以及您预期的输出结果。我用请求的信息编辑了这个问题。这将不起作用,因为
df
没有属性
hour
,执行
df[df.index.hour==23]-pd.Timedelta('1天')甚至不起作用