【问题标题】:Imputing missing Dates in Pandas Dataframe在 Pandas 数据框中输入缺失的日期
【发布时间】:2020-02-16 18:54:43
【问题描述】:
df = pd.read_csv(
    'https://media-doselect.s3.amazonaws.com/generic/MJjpYqLzv08xAkjqLp1ga1Aq/Historical_Data.csv')
df.head()

    Date        Article_ID   Country_Code   Sold_Units
0   20170817        1132       AT               1
1   20170818        1132       AT               1
2   20170821        1132       AT               1
3   20170822        1132       AT               1
4   20170906        1132       AT               1

我有上面给出的 DataFrame。请注意,日期列的类型为 int64,并且缺少日期 19 日和 20 日。

我想将其转换为 yyyy-mm-dd 格式,并在文章 ID、出口代码和销售单位中将缺失的日期归为 0。

到目前为止我已经尝试过:

df['Date'] = pd.to_datetime(df['Date'].astype(str), format='%Y-%m-%d')

获取所需格式的日期。

    Date         Article_ID  Outlet_Code   Sold_Units
0   2017-08-17      1132       AT               1
1   2017-08-18      1132       AT               1
2   2017-08-21      1132       AT               1
3   2017-08-22      1132       AT               1
4   2017-09-06      1132       AT               1

但是,我如何推算缺失的 19 日和 20 日,并在新添加的日期行下推算带有 0 的行?

这是我所做的一个 sn-p,它返回一个值错误:无法从重复的轴重新索引。

【问题讨论】:

    标签: python pandas dataframe datetime


    【解决方案1】:

    您可以使用DataFrame.asfreq 删除重复后重新索引,然后添加重复数据并排序:

    df['Date'] = pd.to_datetime(df['Date'].astype(str), format='%Y-%m-%d')
    df2=df[df.duplicated('Date')].set_index('Date')
    new_df=df.drop_duplicates('Date').set_index('Date').asfreq('D',fill_value=0)
    new_df=new_df.append(df2).sort_index().reset_index()
    print(new_df)
    
             Date  Article_ID Country_Code  Sold_Units
    0  2017-08-17        1132           AT           1
    1  2017-08-17        1132           AT           1
    2  2017-08-18        1132           AT           1
    3  2017-08-19           0            0           0
    4  2017-08-20           0            0           0
    5  2017-08-21        1132           AT           1
    6  2017-08-22        1132           AT           1
    7  2017-08-23           0            0           0
    8  2017-08-24           0            0           0
    9  2017-08-25           0            0           0
    10 2017-08-26           0            0           0
    11 2017-08-27           0            0           0
    12 2017-08-28           0            0           0
    13 2017-08-29           0            0           0
    14 2017-08-30           0            0           0
    15 2017-08-31           0            0           0
    16 2017-09-01           0            0           0
    17 2017-09-02           0            0           0
    18 2017-09-03           0            0           0
    19 2017-09-04           0            0           0
    20 2017-09-05           0            0           0
    21 2017-09-06        1132           AT           1
    

    【讨论】:

    • 我在尝试您的代码时收到此错误。 ValueError:无法从重复的轴重新索引
    • df = pd.read_csv( 'media-doselect.s3.amazonaws.com/generic/…) 这是数据集。
    • 使用 Groupby(level=0) 命令只是在 Date 列之前添加 Level_0。
    • 我添加了返回值错误的输出图像。
    • 我已经更新了代码。该策略可以是在没有重复行的情况下重新索引并稍后添加这些。请检查此尝试:)
    【解决方案2】:

    你可以使用:

    df['Date'] = pd.to_datetime(df['Date'].astype(str), format='%Y-%m-%d',errors='coerce')
    

    您不会错过错过的日期,但它由 NaT 表示。

    你有这样的东西

           Date  Article_ID Outlet_Code  Sold_Units
     0 2017-08-17        1132          AT           1
     1 2017-08-18        1132          AT           1
     2        NaT        1132          AT           1
    

    【讨论】:

    • 我希望将估算的日期附加到数据框中。
    • 什么日期?如果您没有价值,因为它丢失了,那么您就是在伪造价值。您可以假设一个,因为您的数据似乎是有序的,但您不能 100% 确定。
    • 在数据框中,应添加 19 日和 20 日,因为它们缺少日期。商品代码和销售单位的值应为 0。
    • 我没有使用完整的数据框,我只使用了您的前 3 条记录,并在第 3 条记录中留下了空数据。 “errors = 'coerce'” 所做的就是忽略错误并转换您的数据,无论如何。
    • 现在我看到您在谈论日期之间的间隔。我假设它是您的日期列中的 NaN 值。我的错,对不起。但我看到有人已经提供了有效的答案。
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2013-10-19
    • 2020-10-22
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多