在月底和一天结束时重新采样时间序列数据
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 以适应底层数据集的开始和结束时间