我有一个日期类型为2015年1月1日至2019年1月1日的pandas列,我想创建一个新列以将我的值标准化为个位数
我的熊猫专栏如下
A
2015-01-01
2015-02-01
2015-03-01
...
...
2019-12-01
我想要一个新的列,如下所示:
A B
2015-01-01 0
2015-02-01 1
2015-03-01 2
2015-05-01. 4
...
2019-11-01. 46
2019-12-01 47
答案 0 :(得分:1)
对所有值使用Series.asfreq
和DatetimeIndex
,然后按DataFrame.assign
创建范围列,最后使用Series.map
:
s = df.set_index('A').asfreq('MS').assign(new=lambda x: np.arange(len(x)))['new']
df['B'] = df['A'].map(s)
print (df)
A B
0 2015-01-01 0
1 2015-02-01 1
2 2015-03-01 2
3 2019-12-01 59
详细信息:
print (s)
A
2015-01-01 0
2015-02-01 1
2015-03-01 2
2015-04-01 3
2015-05-01 4
2015-06-01 5
2015-07-01 6
...
...
...
2019-06-01 53
2019-07-01 54
2019-08-01 55
2019-09-01 56
2019-10-01 57
2019-11-01 58
2019-12-01 59
Freq: MS, Name: new, dtype: int32
答案 1 :(得分:1)
我们可以使用resample
df1=df.copy()
df.index=df.A
s=df.resample('MS').count()
df1['B']=df1.A.map(pd.Series(np.arange(len(s)),index=s.index))
df1
A B
0 2015-01-01 0
1 2015-02-01 1
2 2015-03-01 2
3 2019-12-01 59
答案 2 :(得分:0)
确保A
是日期时间列
df['A'] = pd.to_datetime(df['A'])
从每个后续日期中减去开始日期。
start = df['A'].sort_values('A').iloc[0, 0]
df'B'] = df['A'].apply(lambda x: x - start).dt.days