【问题标题】:how to normalize date in pandas如何标准化熊猫中的日期
【发布时间】:2019-10-21 13:46:58
【问题描述】:

我有一个日期类型的 pandas 列,范围从 2015-01-01 到 2019-01-01,我想创建一个新列,可以将我的值标准化为个位数

我有一个如下所示的熊猫专栏

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

【问题讨论】:

标签: python pandas numpy


【解决方案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

【讨论】:

  • @jezrael 可以了,我们只需要添加一些过滤器,确保新的 df 只保留原始日期:-)
【解决方案2】:

对所有值使用Series.asfreqDatetimeIndex,然后使用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

【讨论】:

  • 谢谢,这应该可以,但是假设我的字段 2015-03-01 缺少一个日期,而下一个日期 2015-04-01 我希望将值分配为 4 而不是 3
【解决方案3】:

确保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

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2022-09-27
    • 2020-09-27
    • 2020-10-20
    • 1970-01-01
    • 2019-05-20
    • 2022-06-13
    • 2019-12-27
    相关资源
    最近更新 更多