Python 数据时间超出存在NAN的日期、小时和分钟列(熊猫)。是否有管理此类数据的通用解决方案?
为了从包含日期、小时和分钟的三列中得到一列datetime列,我在管理和组合列时遇到了一些问题 假设以下df(复制并键入df==pd.read_clipboard()进行复制)的类型如下所示: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.
>>>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”的列替换这三个列,我尝试了一些方法,但我面临以下问题:
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
str
以将三列连接为“datetime”,那么我将面临NaN
值的问题,这会阻止我将“datetime”转换为相应的类型
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
值怎么办?是否可以忽略所有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
非常感谢,也适用于所有南部!我希望我也能思考清楚。。。