【问题标题】: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

标签: python pandas datetime time


【解决方案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 如果它有效,您可以接受答案:)
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 2018-03-02
  • 2021-04-06
  • 2023-01-22
  • 2022-01-25
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多