在Python中根据开始日期序列复制行

时间:2019-03-20 05:52:56

标签: python pandas

我想通过从开始日期创建一个 n 日期序列来复制数据框中的行。

我的输入文件格式。

col1 col2    date
1    5    2015-07-15
2    6    2015-07-20
3    7    2015-07-25

我的预期输出。

col1 col2     date
1   5       2015-07-15
1   5       2015-07-16
1   5       2015-07-17
1   5       2015-07-18
1   5       2015-07-19
2   6       2015-07-20
2   6       2015-07-21
2   6       2015-07-22
2   6       2015-07-23
2   6       2015-07-24
3   7       2015-07-25
3   7       2015-07-26
3   7       2015-07-27
3   7       2015-07-28
3   7       2015-07-29

我必须创建一个具有日差的日期序列。

谢谢。

3 个答案:

答案 0 :(得分:4)

使用:

df['date'] = pd.to_datetime(df['date'])

n = 15
#create date range by periods
idx = pd.date_range(df['date'].iat[0], periods=n)
#create DatetimeIndex with reindex and forward filling values
df = (df.set_index('date')
        .reindex(idx, method='ffill')
        .reset_index()
        .rename(columns={'index':'date'}))
print (df)

         date  col1  col2
0  2015-07-15     1     5
1  2015-07-16     1     5
2  2015-07-17     1     5
3  2015-07-18     1     5
4  2015-07-19     1     5
5  2015-07-20     2     6
6  2015-07-21     2     6
7  2015-07-22     2     6
8  2015-07-23     2     6
9  2015-07-24     2     6
10 2015-07-25     3     7
11 2015-07-26     3     7
12 2015-07-27     3     7
13 2015-07-28     3     7
14 2015-07-29     3     7

答案 1 :(得分:1)

导入软件包

from datetime import datetime as dt
from datetime import timedelta
import numpy as np

然后将日期范围创建为df

base = dt(2015, 7, 15)
arr = np.array([base + timedelta(days=i) for i in range(15)])
df_d = pd.DataFrame({'date_r' : arr})

如果没有,请更改原始df的数据类型:

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

并与原始df合并,并按日期升序排序:

df_merged = df.merge(df_d, how='right', left_on='date', right_on='date_r')
df_merged.sort_values('date_r', inplace=True)

您将获得此df:

    col1  col2       date     date_r
0    1.0   5.0 2015-07-15 2015-07-15
3    NaN   NaN        NaT 2015-07-16
4    NaN   NaN        NaT 2015-07-17
5    NaN   NaN        NaT 2015-07-18
6    NaN   NaN        NaT 2015-07-19
1    2.0   6.0 2015-07-20 2015-07-20
7    NaN   NaN        NaT 2015-07-21
8    NaN   NaN        NaT 2015-07-22
9    NaN   NaN        NaT 2015-07-23
10   NaN   NaN        NaT 2015-07-24
2    3.0   7.0 2015-07-25 2015-07-25
11   NaN   NaN        NaT 2015-07-26
12   NaN   NaN        NaT 2015-07-27
13   NaN   NaN        NaT 2015-07-28
14   NaN   NaN        NaT 2015-07-29

现在,您只需要使用fillna(method='ffill').astype(int)转发填充:

df_merged['col1'] = df_merged['col1'].fillna(method='ffill').astype(int)
df_merged['col2'] = df_merged['col2'].fillna(method='ffill').astype(int)

出于完整性考虑,请重命名各列以获得原始的预期df:

df_merged = df_merged[['col1', 'col2', 'date_r']]
df_merged.rename(columns={'date_r' : 'date'}, inplace=True)

出于装饰目的:

df_merged.reset_index(inplace=True, drop=True)
print(df_merged)

最终屈服:

    col1  col2       date
0      1     5 2015-07-15
1      1     5 2015-07-16
2      1     5 2015-07-17
3      1     5 2015-07-18
4      1     5 2015-07-19
5      2     6 2015-07-20
6      2     6 2015-07-21
7      2     6 2015-07-22
8      2     6 2015-07-23
9      2     6 2015-07-24
10     3     7 2015-07-25
11     3     7 2015-07-26
12     3     7 2015-07-27
13     3     7 2015-07-28
14     3     7 2015-07-29

答案 2 :(得分:1)

更通用的方法是延长您的时间索引,并用以前的值填充NaN。

尝试一下

         date  col1  col2
0  2015-07-15   1.0   5.0
1  2015-07-16   1.0   5.0
2  2015-07-17   1.0   5.0
3  2015-07-18   1.0   5.0
4  2015-07-19   1.0   5.0
5  2015-07-20   2.0   6.0
6  2015-07-21   2.0   6.0
7  2015-07-22   2.0   6.0
8  2015-07-23   2.0   6.0
9  2015-07-24   2.0   6.0
10 2015-07-25   3.0   7.0

O / P:

subst