【问题标题】:pandas fill missing dates in time series熊猫填补时间序列中缺失的日期
【发布时间】:2018-04-24 04:43:57
【问题描述】:

我有一个数据框,其中汇总了几天的数据。我想补充缺失的日子

我正在关注另一个帖子 Add missing dates to pandas dataframe,不幸的是,它覆盖了我的结果(可能功能略有改变?)...代码如下

import random
import datetime as dt
import numpy as np
import pandas as pd

def generate_row(year, month, day):
    while True:
        date = dt.datetime(year=year, month=month, day=day)
        data = np.random.random(size=4)
        yield [date] + list(data)

# days I have data for
dates = [(2000, 1, 1), (2000, 1, 2), (2000, 2, 4)]
generators = [generate_row(*date) for date in dates]

# get 5 data points for each
data = [next(generator) for generator in generators for _ in range(5)]

df = pd.DataFrame(data, columns=['date'] + ['f'+str(i) for i in range(1,5)])

# df
groupby_day = df.groupby(pd.PeriodIndex(data=df.date, freq='D'))
results = groupby_day.sum()

idx = pd.date_range(min(df.date), max(df.date))
results.reindex(idx, fill_value=0)

填写缺失日期索引前的结果


之后的结果

【问题讨论】:

  • 也许您正在寻找重采样?
  • 看起来很有希望,但我很难从文档中应用它
  • 我想我明白了...df.set_index(df.date, inplace=True) + df = df.resample('D').sum() 很方便
  • 没错。如果可行,请将其写为答案,我会给你一个赞成票。

标签: python pandas


【解决方案1】:

您需要使用period_range 而不是date_range

In [11]: idx = pd.period_range(min(df.date), max(df.date))
    ...: results.reindex(idx, fill_value=0)
    ...:
Out[11]:
                  f1        f2        f3        f4
2000-01-01  2.049157  1.962635  2.756154  2.224751
2000-01-02  2.675899  2.587217  1.540823  1.606150
2000-01-03  0.000000  0.000000  0.000000  0.000000
2000-01-04  0.000000  0.000000  0.000000  0.000000
2000-01-05  0.000000  0.000000  0.000000  0.000000
2000-01-06  0.000000  0.000000  0.000000  0.000000
2000-01-07  0.000000  0.000000  0.000000  0.000000
2000-01-08  0.000000  0.000000  0.000000  0.000000
2000-01-09  0.000000  0.000000  0.000000  0.000000
2000-01-10  0.000000  0.000000  0.000000  0.000000
2000-01-11  0.000000  0.000000  0.000000  0.000000
2000-01-12  0.000000  0.000000  0.000000  0.000000
2000-01-13  0.000000  0.000000  0.000000  0.000000
2000-01-14  0.000000  0.000000  0.000000  0.000000
2000-01-15  0.000000  0.000000  0.000000  0.000000
2000-01-16  0.000000  0.000000  0.000000  0.000000
2000-01-17  0.000000  0.000000  0.000000  0.000000
2000-01-18  0.000000  0.000000  0.000000  0.000000
2000-01-19  0.000000  0.000000  0.000000  0.000000
2000-01-20  0.000000  0.000000  0.000000  0.000000
2000-01-21  0.000000  0.000000  0.000000  0.000000
2000-01-22  0.000000  0.000000  0.000000  0.000000
2000-01-23  0.000000  0.000000  0.000000  0.000000
2000-01-24  0.000000  0.000000  0.000000  0.000000
2000-01-25  0.000000  0.000000  0.000000  0.000000
2000-01-26  0.000000  0.000000  0.000000  0.000000
2000-01-27  0.000000  0.000000  0.000000  0.000000
2000-01-28  0.000000  0.000000  0.000000  0.000000
2000-01-29  0.000000  0.000000  0.000000  0.000000
2000-01-30  0.000000  0.000000  0.000000  0.000000
2000-01-31  0.000000  0.000000  0.000000  0.000000
2000-02-01  0.000000  0.000000  0.000000  0.000000
2000-02-02  0.000000  0.000000  0.000000  0.000000
2000-02-03  0.000000  0.000000  0.000000  0.000000
2000-02-04  1.856158  2.892620  2.986166  2.793448

这是因为您的 groupby 使用的是 PeriodIndex,而不是 datetime:

df.groupby(pd.PeriodIndex(data=df.date, freq='D'))

您可以改用pd.Grouper:

df.groupby(pd.Grouper(key="date", freq='D'))

这会给出一个日期时间索引。

【讨论】:

    【解决方案2】:

    来自cᴏʟᴅsᴘᴇᴇᴅ在cmets中的提示:


    resample 很适合这里。

    Resample:时间序列变频重采样的便捷方法。对象必须具有类似日期时间的索引(DatetimeIndex、PeriodIndex 或 TimedeltaIndex),或者将类似日期时间的值传递给 on 或 level 关键字。

    import random
    import datetime as dt
    import numpy as np
    import pandas as pd
    
    def generate_row(year, month, day):
        while True:
            date = dt.datetime(year=year, month=month, day=day)
            data = np.random.random(size=4)
            yield [date] + list(data)
    
    # days I have data for
    dates = [(2000, 1, 1), (2000, 1, 2), (2000, 2, 4)]
    generators = [generate_row(*date) for date in dates]
    
    # get 5 points for each
    data = [next(generator) for generator in generators for _ in range(5)]
    
    # make dataframe
    df = pd.DataFrame(data, columns=['date'] + ['f'+str(i) for i in range(1,5)])
    
    # using the resample method
    df.set_index(df.date, inplace=True)
    df = df.resample('D').sum().fillna(0)
    

    【讨论】:

    • 你有一些出色的编辑技巧,我什至不知道你可以链接到评论
    • 谢谢...认为链接到评论比我的个人资料更容易;-)
    • 是否可以按照上面的方法做,但不对数据求和,在有多个数据点的日期保持数据不变?例如,1 月 1 日有 5 个数据点,1 月 2 日有 5 个数据点,然后将第 3 个数据点添加为 0?
    • 别管我的问题,它就像与日期系列的外部合并一样简单(制成数据框)-谢谢vm!
    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 2020-06-18
    • 2019-03-03
    • 2018-08-17
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多