大家早安。假设我有以下数据框:
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 |
但是,我不确定每次重复行时如何增加日期。有什么建议么?
答案 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')