Pandas:添加带日期的列

6ovsh4lw  于 2022-11-20  发布在  其他
关注(0)|答案(2)|浏览(113)

我是Python和Pandas的新手,希望能得到一些帮助,使用for循环为Date添加一列。我尝试了下面的代码,以及该代码的一些变体,但总是收到错误。我为'Day'添加了一列,这样我就可以返回一个日期;但后来我删除了该列。
对于SAP Period = 0的行,我希望返回1/1/YYYY。对于所有其他行,我希望返回该月的最后一天。

for y in df_BW['SAP Period']:
    if y == 0:
        df_BW['Period'] = pd.to_datetime(df_BW[['Day', 'SAP Period2', 'Year']].astype(str).apply(' '.join, 1), format='%d %m %Y')
    else:
        df_BW['Period'] = pd.to_datetime(df_BW[['Day', 'SAP Period', 'Year']].astype(str).apply(' '.join, 1), format='%d %m %Y') + MonthEnd()

| 年份|SAP期间|日期|
| - -|- -|- -|
| 小行星2020|第0页|2020年1月1日|
| 小行星2020|一个|2020年1月31日|
| 小行星2020| 2个|2020年2月29日|
| 小行星2020|第0页|2020年1月1日|
| 小行星2020| 2个|2020年2月29日|
| 小行星2020| 2个|2020年2月29日|
| 小行星2020|三个|2020年3月31日|
| 小行星2020|十二|2020年12月31日|
| 小行星2021|第0页|2021年1月1日|
| 小行星2021|一个|2021年1月31日|
| 小行星2021|三个|二零二一年三月三十一日|
| 小行星2021|第0页|2021年1月1日|
| 小行星2021| 2个|2021年2月28日|
| 小行星2021|三个|二零二一年三月三十一日|

h79rfbju

h79rfbju1#

np.wherepandas.teseries.offset.MonthEnd中的MonthEnd一起使用

from pandas.tseries.offsets import MonthEnd

df['date'] = pd.to_datetime(df['Year'].astype(str) + 
              df['SAP Period'].replace(0,1).astype(str).str.zfill(2) + 
             '01',format='%Y%m%d')

df['date'] = np.where(df['SAP Period'].ne(0), df['date'] + MonthEnd(1), df['date'])

    Year  SAP Period        Date       date
0   2020           0    1/1/2020 2020-01-01
1   2020           1   1/31/2020 2020-01-31
2   2020           2   2/29/2020 2020-02-29
3   2020           0    1/1/2020 2020-01-01
4   2020           2   2/29/2020 2020-02-29
5   2020           2   2/29/2020 2020-02-29
6   2020           3   3/31/2020 2020-03-31
7   2020          12  12/31/2020 2020-12-31
8   2021           0    1/1/2021 2021-01-01
9   2021           1   1/31/2021 2021-01-31
10  2021           3   3/31/2021 2021-03-31
11  2021           0    1/1/2021 2021-01-01
12  2021           2   2/28/2021 2021-02-28
13  2021           3   3/31/2021 2021-03-31
lmyy7pcs

lmyy7pcs2#

试试看:

from pandas.tseries.offsets import MonthEnd

df['Date'] = df.apply(lambda x: pd.to_datetime('1/1/' + str(x['Year'])) + MonthEnd(x['SAP Period']),axis=1)

另一个选项:

s = pd.to_datetime(df['SAP Period'] + '/1/' + df['Year'],errors='coerce') + pd.tseries.offsets.MonthEnd(0)
s.where(s.notna(),pd.to_datetime('1' + '/1/' + df['Year']))

s = pd.to_datetime('1/1/' + df['Year'].astype(str)).where(df['SAP Period'].eq(0),df['Date'] + pd.tseries.offsets.MonthEnd(0))

相关问题