Pandas重新取样到固定日期

2024-04-26 14:17:43 发布

您现在位置:Python中文网/ 问答频道 /正文

重采样对我来说在两次之间向上采样行非常有用。在

例如,对于时间序列(ts),例如:

_time                  num
2018-04-11 07:55:00    1
2018-04-11 07:59:00    1

我可以跑:

^{pr2}$

然后得到:

_time                  num
2018-04-11 07:55:00    1
2018-04-11 07:56:00    0
2018-04-11 07:57:00    0
2018-04-11 07:58:00    0
2018-04-11 07:59:00    1

但是,不管怎样,我想重新采样到午夜,而不是重新采样到序列的最后一行。在

例如,最终输出为:

_time                  num
2018-04-11 07:55:00    1
2018-04-11 07:56:00    0
2018-04-11 07:57:00    0
2018-04-11 07:58:00    0
2018-04-11 07:59:00    1
...
2018-04-11 23:58:00    0
2018-04-11 23:59:00    0
2018-04-12 00:00:00    0

一种解决方案是在序列中添加一行,其中_time是午夜,num是0。在

然而,有没有更优雅的内置解决方案呢?在


Tags: time时间序列解决方案num内置tspr2
1条回答
网友
1楼 · 发布于 2024-04-26 14:17:43

虽然没有内置的解决方案来使用resample来达到所需的端点,比如midnight(AFAIK),但是考虑一个动态解决方案,使用pd.concat对单个值(计算midnight序列)添加基于当前ts数据的行。在

具体地说,midnight系列是通过取tsmax索引值并将其规范化到午夜,然后使用datetime的timedelta()添加1天:

import numpy as np
import pandas as pd
import datetime as dt

ts = pd.Series([1,0,0,0,1], name = 'num',
               index = pd.date_range('2018-04-11 07:55:00', periods=5, freq='min')).rename_axis('_time')

# NORMALIZE AND THEN ADD 1 DAY
midnight = pd.Series([np.nan], name = 'num',
                     index = [max(ts.index).normalize() + dt.timedelta(days=1)]).rename_axis('_time')

# CONCATENATE BOTH SERIES AND THEN RESAMPLE
final_ts = pd.concat([ts, midnight]).resample('min').sum().fillna(0)

print(final_ts.head())
# _time
# 2018-04-11 07:55:00    1.0
# 2018-04-11 07:56:00    0.0
# 2018-04-11 07:57:00    0.0
# 2018-04-11 07:58:00    0.0
# 2018-04-11 07:59:00    1.0
# Freq: T, Name: num, dtype: float64

print(final_ts.tail())
# _time
# 2018-04-11 23:56:00    0.0
# 2018-04-11 23:57:00    0.0
# 2018-04-11 23:58:00    0.0
# 2018-04-11 23:59:00    0.0
# 2018-04-12 00:00:00    0.0
# Freq: T, Name: num, dtype: float64

相关问题 更多 >