设置年份的第一个日期,当 pandas 数据框中只有年份时

Fre*_*ers 0 python data-analysis pandas data-preprocessing

我在一个 pandas 数据框中有一个名为“date”的列名称,这是前 10 行:

0    22-Oct-2022
1     3-Dec-2019
2    27-Jun-2022
3           2023
4    15-Jul-2017
5           2019
6     7-Sep-2022
7           2021
8    30-Sep-2022
9    17-Aug-2021
Run Code Online (Sandbox Code Playgroud)

我想将所有这些日期转换为例如:

0    2023-05-19 
1    2023-01-20 
2    ...
Run Code Online (Sandbox Code Playgroud)

对于那些只有 YEAR 的行,我想将其设置为例如,如果原始 df 有:

0           2019
1           2021
Run Code Online (Sandbox Code Playgroud)

5           2019-01-01
7           2021-01-01
Run Code Online (Sandbox Code Playgroud)

换句话说,我的意思是我想在这种情况下设置今年的第一个日期,但保留原始年份而不是当前年份。

我试过:

df['date'] = pd.to_datetime(df['date'], errors='coerce', format='%d-%b-%Y')
Run Code Online (Sandbox Code Playgroud)

然而它正在生成 NaT 值。我希望你们能理解这个案例,如果有任何解决这个问题的想法,我将不胜感激

谢谢。

Tim*_*ess 5

调用时您可以将格式设置为mixed(New in 2.0.0,参见GH50972to_datetime ) :

\n
\n

formatstr,默认无

\n

“混合”,单独推断每个元素的格式。这是有风险的,你应该将它与 dayfirst 一起使用。

\n
\n
df["date"] = pd.to_datetime(df["date"], format="mixed", dayfirst=True)\n
Run Code Online (Sandbox Code Playgroud)\n

或者经典的双重日期解析+ fillna

\n
df["date"] = (\n    pd.to_datetime(df["date"], errors="coerce", format="%Y")\n        .fillna(pd.to_datetime(df["date"], errors="coerce", dayfirst=True))\n)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:\n\xe2\x80\x8b

\n
print(df)\n\n        date\n0 2022-10-22\n1 2019-12-03\n2 2022-06-27\n3 2023-01-01\n4 2017-07-15\n5 2019-01-01\n6 2022-09-07\n7 2021-01-01\n8 2022-09-30\n9 2021-08-17\n
Run Code Online (Sandbox Code Playgroud)\n