Python 生成日期之间缺少的连续日期

Python 生成日期之间缺少的连续日期,python,pandas,Python,Pandas,我有一个动态生成的文件(即,文件头保持不变,但值发生变化)。例如,文件的格式如下: ID,CLASS,DATE,MRK 1,321,02/12/2016,30 2,321,05/12/2016,40 3,321,06/12/2016,0 4,321,07/12/2016,60 5,321,10/12/2016,70 6,876,5/12/2016,100 7,876,7/12/2016,80 关于课程的通知321缺少一些日期,即03/12/2016,04/12/2016,08/12/2016,

我有一个动态生成的文件(即,文件头保持不变,但值发生变化)。例如,文件的格式如下:

ID,CLASS,DATE,MRK
1,321,02/12/2016,30
2,321,05/12/2016,40
3,321,06/12/2016,0
4,321,07/12/2016,60
5,321,10/12/2016,70
6,876,5/12/2016,100
7,876,7/12/2016,80
关于
课程的通知
321
缺少一些日期,即
03/12/2016
04/12/2016
08/12/2016
09/12/2016
。我试图在适当的位置插入缺失的日期,其对应的
MRK
值为
0
。预期产出如下:

ID,CLASS,DATE,MRK
1,321,02/12/2016,30
2,321,03/12/2016,0
3,321,04/12/2016,0
4,321,05/12/2016,40
5,321,06/12/2016,0
6,321,07/12/2016,60
7,321,08/12/2016,0
8,321,09/12/2016,0
9,321,10/12/2016,70
10,876,5/12/2016,100
11,876,6/12/2016,0
12,876,7/12/2016,80
这就是我到目前为止的想法:

import pandas as pd

df = pd.read_csv('In.txt')
resampled_df = df.resample('D').mean()
print resampled_df
但我有个例外:

TypeError:仅对DatetimeIndex、TimedeltaIndex或PeriodIndex有效,但获得了“RangeIndex”的实例。


有人能帮一下python新手吗?

像这样读你的CSV-

df = pd.read_csv('file.csv', 
                 sep=',', 
                 parse_dates=['DATE'],  
                 dayfirst=True,         # this is important since you have days first
                 index_col=['DATE'])
现在,先调用
groupby
+
重新采样
+
并将松散的部分绑起来-

df = df.groupby('CLASS').resample('1D')[['MRK']].first() 

df.ID = np.arange(1, len(df) + 1)
df.MRK = df.MRK.fillna(0).astype(int)

df.reset_index()

    CLASS       DATE  ID  MRK
0     321 2016-12-02   1   30
1     321 2016-12-03   2    0
2     321 2016-12-04   3    0
3     321 2016-12-05   4   40
4     321 2016-12-06   5    0
5     321 2016-12-07   6   60
6     321 2016-12-08   7    0
7     321 2016-12-09   8    0
8     321 2016-12-10   9   70
9     876 2016-12-05  10  100
10    876 2016-12-06  11    0
11    876 2016-12-07  12   80
特别是,
MRK
需要
fillna
。其余的可以向前填充


如果列的顺序很重要,下面是另一个版本

df = pd.read_csv('file.csv', 
                 sep=',', 
                 parse_dates=['DATE'],  
                 dayfirst=True)

c = df.columns
df = df.set_index('DATE').groupby('CLASS').resample('1D')[['MRK']].first()

df['MRK'] = df.MRK.fillna(0).astype(int)
df['ID'] = np.arange(1, len(df) + 1)
df = df.reset_index().reindex(columns=c)
df['DATE'] = df['DATE'].dt.strftime('%d/%m/%Y')

df

    ID  CLASS        DATE  MRK
0    1    321  02/12/2016   30
1    2    321  03/12/2016    0
2    3    321  04/12/2016    0
3    4    321  05/12/2016   40
4    5    321  06/12/2016    0
5    6    321  07/12/2016   60
6    7    321  08/12/2016    0
7    8    321  09/12/2016    0
8    9    321  10/12/2016   70
9   10    876  05/12/2016  100
10  11    876  06/12/2016    0
11  12    876  07/12/2016   80

首先转换为日期时间,然后通过
转换,最后通过以下方式添加列
ID

替代解决方案:

df = (df.set_index('DATE')
        .groupby('CLASS')
        .resample('d')['MRK']
        .first()
        .fillna(0)
        .astype(int)
        .reset_index())

df.insert(0, 'ID', range(1, len(df) + 1))
print (df)
    ID  CLASS       DATE  MRK
0    1    321 2016-12-02   30
1    2    321 2016-12-03    0
2    3    321 2016-12-04    0
3    4    321 2016-12-05   40
4    5    321 2016-12-06    0
5    6    321 2016-12-07   60
6    7    321 2016-12-08    0
7    8    321 2016-12-09    0
8    9    321 2016-12-10   70
9   10    876 2016-12-05  100
10  11    876 2016-12-06    0
11  12    876 2016-12-07   80
最后使用与输入相同的格式:


嗨,这个解决方案很好用。一个小问题是,我注意到输出文件中的日期格式已更改。有什么原因使我不能将其与输入文件中的格式保持一致吗?对于相同的格式,请使用
df['DATE']=df['DATE'].dt.strftime(“%d/%m/%Y”)
Hi,解决方案工作正常。一个小问题是,我注意到输出文件中的日期格式已更改。有什么原因使我不能将其与输入文件中的内容保持一致吗?@Edward我认为这不再重要,但请查看我的编辑。
df = (df.set_index('DATE')
        .groupby('CLASS')
        .resample('d')['MRK']
        .first()
        .fillna(0)
        .astype(int)
        .reset_index())

df.insert(0, 'ID', range(1, len(df) + 1))
print (df)
    ID  CLASS       DATE  MRK
0    1    321 2016-12-02   30
1    2    321 2016-12-03    0
2    3    321 2016-12-04    0
3    4    321 2016-12-05   40
4    5    321 2016-12-06    0
5    6    321 2016-12-07   60
6    7    321 2016-12-08    0
7    8    321 2016-12-09    0
8    9    321 2016-12-10   70
9   10    876 2016-12-05  100
10  11    876 2016-12-06    0
11  12    876 2016-12-07   80
df['DATE'] = df['DATE'].dt.strftime('%d/%m/%Y')
print (df)
    ID  CLASS        DATE  MRK
0    1    321  02/12/2016   30
1    2    321  03/12/2016    0
2    3    321  04/12/2016    0
3    4    321  05/12/2016   40
4    5    321  06/12/2016    0
5    6    321  07/12/2016   60
6    7    321  08/12/2016    0
7    8    321  09/12/2016    0
8    9    321  10/12/2016   70
9   10    876  05/12/2016  100
10  11    876  06/12/2016    0
11  12    876  07/12/2016   80