每次重复的日期时间行增加一年

时间:2019-11-19 15:11:08

标签: python pandas dataframe datetime

大家早安。假设我有以下数据框:

df_array = {"date":["2016/11/4", "2016/11/4", "2016/11/4" , "2014/3/2", "2015/5/6", "2015/5/6"],  "id":["1", "1", "1" , "2", "3", "3"]}
df = pd.DataFrame(df_array)
df["date"] = pd.to_datetime(df["date"])

哪个输出:

| id | date      |
|----|-----------|
| 1  | 2016/11/4 |
| 1  | 2016/11/4 |
| 1  | 2016/11/4 |
| 2  | 2014/3/2  |
| 3  | 2015/5/6  |
| 3  | 2015/5/6  |

我想创建一个名为“ new_date”的新列,该列从每个唯一行的“ date”列中获取日期,在该年的第一天进行转换,然后在该行重复时每次添加一年,像这样:

| id | date      | new_date |
|----|-----------|----------|
| 1  | 2016/11/4 | 2016/1/1 |
| 1  | 2016/11/4 | 2017/1/1 |
| 1  | 2016/11/4 | 2018/1/1 |
| 2  | 2014/3/2  | 2014/1/1 |
| 3  | 2015/5/6  | 2015/1/1 |
| 3  | 2015/5/6  | 2016/1/1 |

我可以运行以下命令来创建new_date列并按以下方式填充它:

df["new_date"] = df.drop_duplicates()["date"].dt.year.apply(lambda x: datetime.datetime(x, 1, 1))

哪个输出:

| id | date      | new_date |
|----|-----------|----------|
| 1  | 2016/11/4 | 2016/1/1 |
| 1  | 2016/11/4 | 2016/1/1 |
| 1  | 2016/11/4 | 2016/1/1 |
| 2  | 2014/3/2  | 2014/1/1 |
| 3  | 2015/5/6  | 2015/1/1 |
| 3  | 2015/5/6  | 2015/1/1 |

但是,我不确定每次重复行时如何增加日期。有什么建议么?

1 个答案:

答案 0 :(得分:2)

每组使用GroupBy.cumcount作为年份的计数器,加到年份并最后转换为日期时间:

y = df['date'].dt.year
df['new_date'] = pd.to_datetime(df.groupby(y).cumcount() + y, format='%Y')
print (df)
        date id   new_date
0 2016-11-04  1 2016-01-01
1 2016-11-04  1 2017-01-01
2 2016-11-04  1 2018-01-01
3 2014-03-02  2 2014-01-01
4 2015-05-06  3 2015-01-01
5 2015-05-06  3 2016-01-01

或者您可以指定带有日期的月份:

y = df['date'].dt.year
df['new_date'] = pd.to_datetime((df.groupby(y).cumcount() + y).astype(str) + '-01-01')