将缺失的日期添加到时间序列数据框

Posted

技术标签:

【中文标题】将缺失的日期添加到时间序列数据框【英文标题】:Add missing dates to time series data-frame 【发布时间】:2021-08-11 10:46:36 【问题描述】:

我有一个时间序列数据框,其中包含多个城市的年度温度值,但对于一些城市,我缺少一组日期

数据框示例

ID      Date        City    PRCP    TAVG    TMAX    TMIN
abcd1   2020-01-01  Zurich  0       -1.9    -0.9    -2.9
abcd1   2020-01-02  Zurich  9.1      8.8    12.7    4.9
abcd1   2020-01-03  Zurich  0.8      8.55   13.2    3.9
abcd1   2020-01-04  Zurich  0        4.1    10.8    -2.6

.
.
abcd9   2020-01-01 Singapore 4.1    5.9     0.3     3.1
abcd9   2020-01-04 Singapore 0.32   13.78   4.22    9   
abcd9   2020-01-28 Singapore 9.42   11.32   5.34    8.33
...

现在假设每个月都缺少一些日期,因此Date 列中的总天数为 300 天。我想将剩余的天数添加到数据集,并将 nulls(NaN) 分配给列 TMAX,TMIN.. 以使总天数为 365。

这就是我现在正在做的事情

df_list = []

for (columns, group) in df.groupby(['ID', 'City']):
    idx = pd.MultiIndex.from_product([group['ID'].unique(),
                                      pd.date_range(group['Date'].min().replace(day=1), end=group['Date'].max(), freq='D')],
                                     names=['ID', 'Date'])
    group = group.set_index(['ID', 'Date']).reindex(idx).reset_index()
    group['City'] = group['City'].fillna(method='bfill')
    df_list.append(group)

data = pd.concat(df_list, ignore_index=True)

它的作用是填充start_indexend_index 之间的日期(并将这些日期的NaN 填充为PRCP、TMIN、TMAX、TAVG),但即使这样我最终还是错过了一些日期,即计数不等于 365。

例如,如果源文件包含从 10 月 1 日到 10 月 28 日的数据,则上述将添加此范围之间的任何缺失日期,但不会将 29、30、31 添加到数据集。

有没有一种方法可以为我的City 列中的所有城市估算从1 Jan31 Dec(年份无关紧要并忽略闰年)的所有日期。

【问题讨论】:

ID 列是什么(可能是CODE)? @Corralien 是的,进行了编辑 如果不考虑年份和闰年,是否可以将Date 替换为DayOfYear 【参考方案1】:

可以通过在GroupBy.apply 中使用带有DataFrame.reindex 的自定义函数在数据框中添加缺失的日期,然后重新分配索引:

df['Date'] = pd.to_datetime(df['Date'])

f = lambda x: x.reindex(pd.date_range(pd.to_datetime('2020-01-01'), pd.to_datetime('2020-12-31'), name='date'))
df = df.set_index('Date').groupby(['ID','City']).apply(f).drop(['ID','City'], axis=1)

【讨论】:

这种工作(使用reset_index()),但我的其余列​​TMAX,TMIN... 都有NaN,即整个年度数据都有NaN 检查日期列的数据类型并将其转换为日期时间,如第一行所述。我之前遇到了同样的错误 在您的情况下,您是否将 CODE 替换为 ID ?这是输出imgur.com/a/S2UIhX5 如果它有效,您可以接受答案:)

以上是关于将缺失的日期添加到时间序列数据框的主要内容,如果未能解决你的问题,请参考以下文章

熊猫将时间间隔重叠到时间序列

如何将数据点添加到时间序列线图中以突出显示事件?

将特征添加到时间序列预测模型输入的适当方法

Python pandas:在groupby数据框中插入缺失日期、时间序列的行

熊猫数据框日期时间到时间然后到秒

从 mysql 中提取每日数据更改并部署到时间序列数据库