Python Pandas,仅在特定时间重新采样

6gpjuf90  于 2023-04-19  发布在  Python
关注(0)|答案(2)|浏览(100)

我的pandas版本是0.18,我有一个分钟数据,如下所示:

Time                              
2009-01-30 09:30:00  85.11  100.11
2009-01-30 09:39:00  84.93  100.05
2009-01-30 09:40:00  84.90  100.00
2009-01-30 09:45:00  84.91   99.94
2009-01-30 09:48:00  84.81   99.90
2009-01-30 09:55:00  84.78  100.00
2009-01-30 09:56:00  84.57  100.10
2009-01-30 09:59:00  84.25  100.41
2009-01-30 10:00:00  84.32  100.60
2009-01-30 10:06:00  84.23  101.49
2009-01-30 10:09:00  84.15  101.47

我只想使用9:30到16:00的数据,并以78分钟的间隔对数据进行重新采样(即将9:30到16:00之间的时间分为5等份)。我的代码如下所示:

Data= Data.between_time('9:30','16:00')
tframe = '78T'
hourlym = Data.resample(tframe, base=30).mean()

输出:

Time                                      
2009-01-30 08:18:00  85.110000  100.110000
2009-01-30 09:36:00  83.950645  101.984516
2009-01-30 10:54:00  83.372294  103.093824
2009-01-30 12:12:00  83.698624  102.566897
2009-01-30 13:30:00  83.224397  103.076667
2009-01-30 14:48:00  82.641167  104.114667
2009-01-30 16:06:00        NaN         NaN
2009-01-30 17:24:00        NaN         NaN
2009-01-30 18:42:00        NaN         NaN

正如你所看到的,pandas忽略了我的基本参数,我的输出表从8:18开始,我相信这是因为pandas寻求如何正确地将我的整个数据分为78分钟,因为你不能将24小时平均分为78分钟,所以发生了这种奇怪的行为。是否可以强制pandas从第一天的9:30开始重新采样?或者只在特定的时间重新采样?

nhaq1z21

nhaq1z211#

base参数应用于午夜,因此在您的示例中,采样从00:30开始,并从那里增加78分钟的增量。

选项1

计算应用于午夜的base应该是多少,以便到达9:30(在本例中为24):

Data.resample(tframe, base=24)

选项二

自己生成datetimeindex,并使用reindex重新采样:

index = pd.date_range('2009-01-30 09:30:00', '2009-01-30 16:00:00', freq='78min')
Data.reindex(index=index)

EDIT:对于多天,您需要自己生成时间戳。

index_date = pd.date_range('2016-04-01', '2016-04-04')
index_date = pd.Series(index_date)
index_time = pd.date_range('09:30:00', '16:00:00', freq='78min')
index_time = pd.Series(index_time.time)

index = index_date.apply(
    lambda d: index_time.apply(
        lambda t: datetime.combine(d, t)
        )
    ).unstack().sort_values().reset_index(drop=True)

下面是代码的作用:

  • 生成您感兴趣的日期和时间,并将它们转换为具有apply属性的序列。
  • 使用嵌套的“applices”,循环日期和时间,并将它们组合成一个datetime对象。
  • 输出是一个正方形的 Dataframe (每个日期一列),所以我unstack并对时间戳进行排序(最后重置索引以摆脱沿着生成的无用索引)。

生成的index可用于重新索引,如最初的选项2所示:

Data.reindex(index=index)
iqjalb3h

iqjalb3h2#

IanS给出的答案相当完整。
正如我注意到你的问题中的日期,我认为你是在印度交易场景中尝试这些操作.所以,它会更好,如果你创建您的自定义日历使用pd.tseries.offsets.CustomBusinessDay(holidays=holiday_list):https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html?highlight=holiday#custom-business-days
假设从1980年到2025年(仅适用于B日())+删除(1980年到2025年的交易假期列表(您可以在谷歌上搜索)。
这将帮助你,如果你正在做纸交易回测和进口数据从许多股票。

或者您可以安装packagepip install pandas_market_calendars

import pandas_market_calendars as mcal

# Create a calendar
nyse = mcal.get_calendar('NYSE')

# Show available calendars
print(mcal.get_calendar_names())

early = nyse.schedule(start_date='2012-07-01', end_date='2012-07-10')
early

                  market_open             market_close
=========== ========================= =========================
 2012-07-02 2012-07-02 13:30:00+00:00 2012-07-02 20:00:00+00:00
 2012-07-03 2012-07-03 13:30:00+00:00 2012-07-03 17:00:00+00:00
 2012-07-05 2012-07-05 13:30:00+00:00 2012-07-05 20:00:00+00:00

mcal.date_range(early, frequency='1D')

DatetimeIndex(['2012-07-02 20:00:00+00:00', '2012-07-03 17:00:00+00:00',
               '2012-07-05 20:00:00+00:00', '2012-07-06 20:00:00+00:00',
               '2012-07-09 20:00:00+00:00', '2012-07-10 20:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq=None)

mcal.date_range(early, frequency='1H')

DatetimeIndex(['2012-07-02 14:30:00+00:00', '2012-07-02 15:30:00+00:00',
               '2012-07-02 16:30:00+00:00', '2012-07-02 17:30:00+00:00',
               '2012-07-02 18:30:00+00:00', '2012-07-02 19:30:00+00:00',
               '2012-07-02 20:00:00+00:00', '2012-07-03 14:30:00+00:00',

之后就做吧

Data.reindex(index=name_of_date_object_list)

相关问题