在 pandas 数据框中操作 DateTimeIndex

问题描述 投票:0回答:1

请在 5 分钟时间范围内考虑带有日期时间索引的数据框:

import pandas as pd
import numpy as np

index = pd.date_range(start='2019-01-01 00:00', freq='5min', periods=500)
df = pd.DataFrame({'x' : np.arange(len(index))}, index = index)

print(df)

                    x
2019-01-01 00:00:00 0
2019-01-01 00:05:00 1
2019-01-01 00:10:00 2
2019-01-01 00:15:00 3
2019-01-01 00:20:00 4
... ...
2019-01-02 17:15:00 495
2019-01-02 17:20:00 496
2019-01-02 17:25:00 497
2019-01-02 17:30:00 498
2019-01-02 17:35:00 499
500 rows × 1 columns

目标:操纵数据时间索引,使得

df.loc[specific_date]
将返回从前一个日期下午6点到
specific_date
下午5点开始的数据。例如,
df.loc['2019-01-02']
应返回从 2019-01-01 下午 6 点到 2019-01-02 下午 5 点开始的数据。

我尝试过的:

dates = df.resample('D').sum().index

data_l = []
for i in range(len(dates)-1):

    night_data = df[df.index.date == dates[i].date()].between_time('18:00', '23:55')
    day_data =   df[df.index.date == dates[i].date()].between_time('00:00', '16:55')
    data = pd.concat([night_data , day_data ], axis = 0)
    data.index= data.index.map(lambda x : x.replace(day = dates[i+1].day))
    data_l.append(data)

df_reindexed = pd.concat(data_l, axis =0)

请注意,索引不一定是规则的,有些索引可能会丢失。

问题:代码可以工作,但数据太大(数千个日期)并且代码花费的时间太长。有没有更有效的方法来做到这一点?

python-3.x pandas datetime
1个回答
0
投票

代码

df.resample('D', origin='2018-12-31 18:00')['x'].sum()
© www.soinside.com 2019 - 2024. All rights reserved.