屏蔽数据框以将字符串转换为日期时间将一些条目转换为 NaT

问题描述 投票:0回答:2

我有一个像这样的数据框:

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

我希望他们保持原样。

python pandas dataframe datetime mask
2个回答
2
投票

你不需要掩盖任何东西,只需使用

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'])

1
投票

如评论中所述,如果您有一列包含日期时间,那么拥有其他类型(例如整数)就没有意义。

如果你真的需要,你可以这样做,但这会强制对象数据类型:

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
© www.soinside.com 2019 - 2024. All rights reserved.