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

时间:2019-02-26 17:49:53

标签: python pandas datetime dataframe

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

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

重置会花费我更多的时间,因为我的数据帧索引的分布不均匀,如下图所示(两次连续输入之间的间隔是15分钟一次,一次30分钟一次)。从图中还请注意最后三个条目中的错误日期:应该是2018-02-05,而不是2018-02-06。

我试图这样做

df[df.index.hour == 23].index.day = df[df.index.hour == 23].index.day - 1

但是我得到AttributeError: can't set attribute

样本数据:

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

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以尝试TimeDeltas

如果数据框具有日期时间索引,则应该可以直接从中减去。

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

如果df.index类型为字符串,则应首先更改类型,然后减去: df.index = pd.to_datetime(df.index)

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

答案 1 :(得分:0)

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

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