我有一个像这样的数据框:
Index Hour type Horizon Day BZ Value
0 1 ND D-2 17-12-2022 FI 7258
1 1 ND D-1 16-12-2022 FI 3702
2 1 ND D-1 15-12-2022 FI 3702
3 1 ND D-1 14-12-2022 FI 3702
4 1 ND D-1 13-12-2022 FI 3702
5 1 ND D-1 10-12-2022 FI 3702
6 1 Selected 7 FI 4885
我尝试屏蔽它,就像您在下面的代码中看到的那样,然后使用该屏蔽将另一列中的条目转换为日期时间,但它也会选择屏蔽条件为假的条目并将它们转换为“NaT”。我不知道为什么。
mask = df_long['type'] == 'ND'
df_long['Day2']= pd.to_datetime(df_long['Day'][mask],format='%d-%m-%Y')
像这样:
Index Hour type Horizon Day BZ Value Day2
0 1 ND D-2 17-12-2022 FI 7258 2022-12-17 00:00:00
1 1 ND D-1 16-12-2022 FI 3702 2022-12-16 00:00:00
2 1 ND D-1 15-12-2022 FI 3702 2022-12-15 00:00:00
3 1 ND D-1 14-12-2022 FI 3702 2022-12-14 00:00:00
4 1 ND D-1 13-12-2022 FI 3702 2022-12-13 00:00:00
5 1 ND D-1 10-12-2022 FI 3702 2022-12-10 00:00:00
6 1 Selected 7 FI 4885 NaT
我希望他们保持原样。
你不需要掩盖任何东西,只需使用
errors=coerce
:
df['Day2'] = pd.to_datetime(df['Day'], dayfirst=True, errors='coerce').fillna(df['Day'])
print(df)
# Output
Hour type Horizon Day BZ Value Day2
0 1 ND D-2 17-12-2022 FI 7258 2022-12-17 00:00:00
1 1 ND D-1 16-12-2022 FI 3702 2022-12-16 00:00:00
2 1 ND D-1 15-12-2022 FI 3702 2022-12-15 00:00:00
3 1 ND D-1 14-12-2022 FI 3702 2022-12-14 00:00:00
4 1 ND D-1 13-12-2022 FI 3702 2022-12-13 00:00:00
5 1 ND D-1 10-12-2022 FI 3702 2022-12-10 00:00:00
6 1 Selected 7 FI 4885 7
或使用
where
:
df['Day2'] = pd.to_datetime(df['Day'].where(df['type']=='ND'), dayfirst=True).fillna(df['Day'])
如评论中所述,如果您有一列包含日期时间,那么拥有其他类型(例如整数)就没有意义。
如果你真的需要,你可以这样做,但这会强制对象数据类型:
df_long['Day2'] = df_long['Day'].mask(mask, pd.to_datetime(df_long['Day'].where(mask), format='%d-%m-%Y').astype(object))
输出:
Index Hour type Horizon Day BZ Value Day2
0 0 1 ND D-2 17-12-2022 FI 7258 2022-12-17 00:00:00
1 1 1 ND D-1 16-12-2022 FI 3702 2022-12-16 00:00:00
2 2 1 ND D-1 15-12-2022 FI 3702 2022-12-15 00:00:00
3 3 1 ND D-1 14-12-2022 FI 3702 2022-12-14 00:00:00
4 4 1 ND D-1 13-12-2022 FI 3702 2022-12-13 00:00:00
5 5 1 ND D-1 10-12-2022 FI 3702 2022-12-10 00:00:00
6 6 1 Selected NaN 7 FI 4885 7
类型:
df_long.dtypes
Index int64
Hour int64
type object
Horizon object
Day object
BZ object
Value int64
Day2 object # not datetime64
dtype: object