Python 数据时间超出存在NAN的日期、小时和分钟列(熊猫)。是否有管理此类数据的通用解决方案?

Python 数据时间超出存在NAN的日期、小时和分钟列(熊猫)。是否有管理此类数据的通用解决方案?,python,pandas,datetime,Python,Pandas,Datetime,为了从包含日期、小时和分钟的三列中得到一列datetime列,我在管理和组合列时遇到了一些问题 假设以下df(复制并键入df==pd.read_clipboard()进行复制)的类型如下所示: >>>df date hour minute 0 2021-01-01 7.0 15.0 1 2021-01-02 3.0 30.0 2 2021-01-02 NaN NaN 3 2021-01-03 9.0 0.

为了从包含日期、小时和分钟的三列中得到一列datetime列,我在管理和组合列时遇到了一些问题

假设以下df(复制并键入df==pd.read_clipboard()进行复制)的类型如下所示:

>>>df
         date  hour  minute
0  2021-01-01   7.0    15.0
1  2021-01-02   3.0    30.0
2  2021-01-02   NaN     NaN
3  2021-01-03   9.0     0.0
4  2021-01-04   4.0    45.0

>>>df.dtypes
date       object
hour      float64
minute    float64
dtype: object
我想用一个名为“datetime”的列替换这三个列,我尝试了一些方法,但我面临以下问题:

  • 我首先创建一个'time'列
    df['time']=(pd.to_datetime(df['hour',unit='h')+pd.to_timedelta(df['minute',unit='m')).dt.time
    ,然后我尝试将它与'datetime'列
    df['datetime']=df['datetime'+'+'+df['time']
    (目的是将'datetime'列
    pd.转换为
    。但是,我

    TypeError:只能将str(而不是“datetime.time”)连接到str

  • 如果我将“hour”和“minute”转换为
    str
    以将三列连接为“datetime”,那么我将面临
    NaN
    值的问题,这会阻止我将“datetime”转换为相应的类型

  • 我还尝试先将'date'列
    df['date']=df['date'].astype('datetime64[ns]')
    ,然后再次创建'time'列
    df['time']=(pd.to_datetime(df['hour'],unit='h')+pd.to_timedelta(df['minute'],unit='m')).dt.time
    将两者结合起来:
    df['datetime']=pd.datetime.combine(df['date']),df']['time'])
    然后返回

    TypeError:combine()参数1必须是datetime.date,而不是Series
    伴随着警告

    FutureWarning:pandas.datetime类已弃用,将在将来的版本中从pandas中删除。请改为从datetime模块导入。

  • 是否有一个通用的解决方案来组合这三列并忽略NaN值(假设它可以返回00:00:00)

    如果我有一行包含所有
    NaN
    值怎么办?是否可以忽略所有NaN,并且此行的“datetime”为NaN


    提前谢谢,^ ^ ^

    首先将
    日期
    转换为日期时间,然后添加小时和分钟时间增量,并替换缺少的值到
    0时间增量

    td = pd.Timedelta(0)
    df['datetime'] = (pd.to_datetime(df['date']) + 
                      pd.to_timedelta(df['hour'], unit='h').fillna(td) + 
                      pd.to_timedelta(df['minute'], unit='m').fillna(td))
    
    print (df)
             date  hour  minute            datetime
    0  2021-01-01   7.0    15.0 2021-01-01 07:15:00
    1  2021-01-02   3.0    30.0 2021-01-02 03:30:00
    2  2021-01-02   NaN     NaN 2021-01-02 00:00:00
    3  2021-01-03   9.0     0.0 2021-01-03 09:00:00
    4  2021-01-04   4.0    45.0 2021-01-04 04:45:00
    
    或者您可以与
    fill\u value=0一起使用:

    df['datetime'] = (pd.to_datetime(df['date'])
                        .add(pd.to_timedelta(df['hour'], unit='h'), fill_value=0) 
                        .add(pd.to_timedelta(df['minute'], unit='m'), fill_value=0))
    

    我建议将小时和分钟列转换为字符串,并从提供的组件构造datetime字符串

    从逻辑上讲,您需要执行以下步骤:

    步骤1。用零填充小时和分钟的缺失值

    df['hour'] = df['hour'].fillna(0)
    df['minute'] = df['minute'].fillna(0)
    
    步骤2。将小时和分钟的浮点值转换为整数,因为您的最终输出应该是2021-01-01 7:15,而不是2021-01-01 7.0:15.0

    df['hour'] = df['hour'].astype(int)
    df['minute'] = df['minute'].astype(int)
    
    步骤3。将小时和分钟的整数值转换为字符串表示形式

    df['hour'] = df['hour'].astype(str)
    df['minute'] = df['minute'].astype(str)
    
    第4步。将日期、小时和分钟合并为一列,格式正确

    df['result'] = df['date'].str.cat(df['hour'].str.cat(df['minute'], sep=':'), sep=' ')
    
    步骤5。将结果列转换为datetime对象

    pd.to_datetime(df['result'])
    
    也可以在一个命令中完成所有这些步骤,尽管它会读起来有点混乱:

    df['result'] = pd.to_datetime(df['date'].str.cat(df['hour'].fillna(0).astype(int).astype(str).str.cat(df['minute'].fillna(0).astype(int).astype(str), sep=':'), sep=' '))
    
    结果:

       date         hour  minute              result
    0  2020-01-01   7.0    15.0 2020-01-01 07:15:00
    1  2020-01-02   3.0    30.0 2020-01-02 03:30:00
    2  2020-01-02   NaN     NaN 2020-01-02 00:00:00
    3  2020-01-03   9.0     0.0 2020-01-03 09:00:00
    4  2020-01-04   4.0    45.0 2020-01-04 04:45:00
    

    非常感谢,也适用于所有南部!我希望我也能思考清楚。。。