在Pandas Dataframe中估算缺少的日期

时间:2019-10-20 13:30:49

标签: python pandas dataframe datetime

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呢?

这是我所做的代码片段,返回值错误:无法从重复的轴重新索引。

enter image description here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用:

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