用熊猫 df 中"日期"(yyyymmdd) 列中每行的最后两位数字 (dd) 进行处理



我正在尝试处理一整列日期值,以将其在 Pandas 数据帧中的数字列中从"1"更改为"每月的最后一天"。代码必须能够处理 28、29、30 或 31 个值的列,具体取决于哪个月份。所以我的df:

        DAY      TX     TN
0   20190201    4.9     -0.6
1   20190202    2.7     0.0
2   20190203    4.6     -0.3
3   20190204    2.9     -0.5
4   20190205    6.2     1.3
5   20190206    7.5     2.4
6   20190207    8.6     4.6
7   20190208    8.6     5.0
8   20190209    9.2     6.7
9   20190210    9.1     3.8
10  20190211    6.9     0.7
11  20190212    7.0     -0.5
12  20190213    7.8     -0.5
13  20190214    13.4    0.0
14  20190215    16.4    2.0
15  20190216    14.8    2.0
16  20190217    15.7    1.2
17  20190218    15.4    1.2
18  20190219    9.8     4.3
19  20190220    11.1    2.8
20  20190221    13.1    5.8
21  20190222    10.7    4.1
22  20190223    12.9    1.5
23  20190224    14.5    1.2
24  20190225    16.1    2.2
25  20190226    17.2    0.3
26  20190227    19.3    1.1
27  20190228    11.3    5.1

应该成为

   DAY   TX     TN
0   1   4.9     -0.6
1   2   2.7     0.0
2   3   4.6     -0.3
3   4   2.9     -0.5
4   5   6.2     1.3
5   6   7.5     2.4
6   7   8.6     4.6
7   8   8.6     5.0
8   9   9.2     6.7
9   10  9.1     3.8
10  11  6.9     0.7
11  12  7.0     -0.5
12  13  7.8     -0.5
13  14  13.4    0.0
14  15  16.4    2.0
15  16  14.8    2.0
16  17  15.7    1.2
17  18  15.4    1.2
18  19  9.8     4.3
19  20  11.1    2.8
20  21  13.1    5.8
21  22  10.7    4.1
22  23  12.9    1.5
23  24  14.5    1.2
24  25  16.1    2.2
25  26  17.2    0.3
26  27  19.3    1.1
27  28  11.3    5.1

我必须处理此列的每个值,以便我还可以检查是否没有缺少任何一天,并且数字的生成是否适应我将提供的每个月-df。我在Pandas文档中搜索了可以提供帮助的说明,但没有找到。任何帮助将不胜感激。

to_datetimeSeries.dt.day一起使用:

df['DAY'] = pd.to_datetime(df['DAY'], format='%Y%m%d').dt.day

另一种解决方案是将值转换为字符串,通过索引获取最后 2 个整数并转换为整数:

df['DAY'] = df['DAY'].astype(str).str[-2:].astype(int)

print (df)
    DAY    TX   TN
0     1   4.9 -0.6
1     2   2.7  0.0
2     3   4.6 -0.3
3     4   2.9 -0.5
4     5   6.2  1.3
5     6   7.5  2.4
6     7   8.6  4.6
7     8   8.6  5.0
8     9   9.2  6.7
9    10   9.1  3.8
10   11   6.9  0.7
11   12   7.0 -0.5
12   13   7.8 -0.5
13   14  13.4  0.0
14   15  16.4  2.0
15   16  14.8  2.0
16   17  15.7  1.2
17   18  15.4  1.2
18   19   9.8  4.3
19   20  11.1  2.8
20   21  13.1  5.8
21   22  10.7  4.1
22   23  12.9  1.5
23   24  14.5  1.2
24   25  16.1  2.2
25   26  17.2  0.3
26   27  19.3  1.1
27   28  11.3  5.1

您只需对列进行切片以获取最后 2 位数字并转换为 int

In[85]:
df['DAY'] = df['DAY'].str[-2:].astype(int)
df
Out[85]: 
    DAY    TX   TN
0     1   4.9 -0.6
1     2   2.7  0.0
2     3   4.6 -0.3
3     4   2.9 -0.5
4     5   6.2  1.3
5     6   7.5  2.4
6     7   8.6  4.6
7     8   8.6  5.0
8     9   9.2  6.7
9    10   9.1  3.8
10   11   6.9  0.7
11   12   7.0 -0.5
12   13   7.8 -0.5
13   14  13.4  0.0
14   15  16.4  2.0
15   16  14.8  2.0
16   17  15.7  1.2
17   18  15.4  1.2
18   19   9.8  4.3
19   20  11.1  2.8
20   21  13.1  5.8
21   22  10.7  4.1
22   23  12.9  1.5
23   24  14.5  1.2
24   25  16.1  2.2
25   26  17.2  0.3
26   27  19.3  1.1
27   28  11.3  5.1

如果dtype已经int,那么您只需要先投射到str

df['DAY'] = df['DAY'].astype(str).str[-2:].astype(int)

最新更新