将缺失的日期添加到时间序列数据框
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_index
和end_index
之间的日期(并将这些日期的NaN 填充为PRCP、TMIN、TMAX、TAVG),但即使这样我最终还是错过了一些日期,即计数不等于 365。
例如,如果源文件包含从 10 月 1 日到 10 月 28 日的数据,则上述将添加此范围之间的任何缺失日期,但不会将 29、30、31 添加到数据集。
有没有一种方法可以为我的City
列中的所有城市估算从1 Jan
到31 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 如果它有效,您可以接受答案:)以上是关于将缺失的日期添加到时间序列数据框的主要内容,如果未能解决你的问题,请参考以下文章