在月底和一天结束时重新采样时间序列数据

Posted

技术标签:

【中文标题】在月底和一天结束时重新采样时间序列数据【英文标题】:Resample a time-series data at the end of the month and at the end of the day 【发布时间】:2022-01-21 07:23:38 【问题描述】:

我有一个时间序列数据,格式如下。

DateShort (%d/%m/%Y) TimeFrom TimeTo Value
1/1/2018 0:00 1:00 6414
1/1/2018 1:00 2:00 6153
... ... ... ...
1/1/2018 23:00 0:00 6317
2/1/2018 0:00 1:00 6046
... ... ... ...

我想在月底在一天结束时重新采样数据。

可以从https://pastebin.com/raw/NWdigN97检索数据集

pandas.DataFrame.resample() 提供'M' 规则来检索月末但一天开始的数据。 见https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html

你有更好的解决方案来完成这个吗?

我有以下示例代码:

import numpy as np
import pandas as pd

ds_url = 'https://pastebin.com/raw/NWdigN97'

df = pd.read_csv(ds_url, header=0)

df['DateTime'] = pd.to_datetime(
    df['DateShort'] + ' ' + df['TimeFrom'],
    format='%d/%m/%Y %H:%M'
)

df.drop('DateShort', axis=1, inplace=True)
df.set_index('DateTime', inplace=True)

df.resample('M').asfreq()

输出是

           TimeFrom TimeTo  Value
DateTime                         
2018-01-31     0:00   1:00   7215
2018-02-28     0:00   1:00   8580
2018-03-31     0:00   1:00   6202
2018-04-30     0:00   1:00   5369
2018-05-31     0:00   1:00   5840
2018-06-30     0:00   1:00   5730
2018-07-31     0:00   1:00   5979
2018-08-31     0:00   1:00   6009
2018-09-30     0:00   1:00   5430
2018-10-31     0:00   1:00   6587
2018-11-30     0:00   1:00   7948
2018-12-31     0:00   1:00   6193

但是,正确的输出应该是

           TimeFrom TimeTo  Value
DateTime                            
2018-01-31  23:00   0:00    7605
2018-02-28  23:00   0:00    8790
2018-03-31  23:00   0:00    5967
2018-04-30  23:00   0:00    5595
2018-05-31  23:00   0:00    5558
2018-06-30  23:00   0:00    5153
2018-07-31  23:00   0:00    5996
2018-08-31  23:00   0:00    5757
2018-09-30  23:00   0:00    5785
2018-10-31  23:00   0:00    6437
2018-11-30  23:00   0:00    7830
2018-12-31  23:00   0:00    6767

【问题讨论】:

【参考方案1】:

试试这个:

df.groupby(pd.Grouper(freq='M')).last()

输出:

           TimeFrom TimeTo  Value
DateTime                         
2018-01-31    23:00   0:00   7605
2018-02-28    23:00   0:00   8790
2018-03-31    23:00   0:00   5967
2018-04-30    23:00   0:00   5595
2018-05-31    23:00   0:00   5558
2018-06-30    23:00   0:00   5153
2018-07-31    23:00   0:00   5996
2018-08-31    23:00   0:00   5757
2018-09-30    23:00   0:00   5785
2018-10-31    23:00   0:00   6437
2018-11-30    23:00   0:00   7830
2018-12-31    23:00   0:00   6707

【讨论】:

以上是关于在月底和一天结束时重新采样时间序列数据的主要内容,如果未能解决你的问题,请参考以下文章

大熊猫时间序列重新采样结束一天

Pandas Dataframe 时间序列重新采样,如何修改 bin 以适应底层数据集的开始和结束时间

使用特定的开始/结束日期以及 groupby 重新采样数据框

每月结束的数据准备 - 超过 12 个月

将 pandas 中的时间序列重新采样为每周间隔

将数据帧重新采样为具有任意期末月份的 n 个月期间