python 中pandas的时间列赋值后类型出现问题,强制转换为datetime64类型时出现:mixed datetimes and integers in passed array错误

在Pandas中处理时间数据时,遇到价格结束时间列赋值后类型不统一的问题,通过将整列初始化为统一时间格式,再进行赋值操作,避免了类型错误。

要对pandas中的[价格结束时间]列进行赋值,使用语句

df_goods.loc[df_middle, '价格结束时间'] = df_goods.loc[df_middle, '价格生效时间1'] - DateOffset(days=1)

其中df_middle是个条件语句执行后获得的bool列

打印出来发现 '价格结束时间'列中,满足df_middle条件的行的内容是一串数字,如:1573689600000000000,而不是时间格式,

列的类型也是object,不是datetime64类型。

原因:

    赋值前'价格结束时间'列中有时间格式的行,也有为空的行,不统一,导致赋值后,整个列的类型不统一

针对这个问题,在赋值后,使用语句

df_goods['价格结束时间']=df_goods['价格结束时间'].astype('datetime64')

强制转换为datetime64类型时出现:mixed datetimes and integers in passed array错误

解决办法:

对['价格结束时间']列进行赋值时,想了很多种类型转换的方法都无效,最终只能在赋值前,把该列所有内容都赋值为一个时间,

    df_goods['价格结束时间'] = pd.to_datetime('2099-01-01')

然后修改某些行的数据时,就不会出现类型错误

什么道理,没搞明白。

在处理包含混合类型的数据数组,特别是在涉及时间类型(如`datetimenum`)的情况下,出现`ValueError: mixed datetimes and integers in passed array`错误的原因是数组中同包含了日期时间和整数类型的数据。这种混合类型会导致类型转换失败,因为Pandas无法自动将这些不同类型的数据统一转换为一致的时间类型[^1]。 ### 错误原因 1. **数据类型不一致**:当数组中同包含日期时间格式的字符串或整数(如时间戳)和普通整数Pandas在尝试将整个数组转换为日期时间类型会失败。 2. **隐式类型推断失败**:Pandas在读取数据会尝试自动推断数据类型,但如果数据中存在多种可能的解析方式(如6位数字表示日期、10位数字表示时间戳等),则可能导致类型推断失败[^3]。 ### 解决方案 为了有效解决这个问题,可以采取以下几种方法: 1. **显式指定数据类型**:在读取数据,可以通过`dtype`参数显式指定某些为特定的数据类型。例如,可以将时间指定为`datetime64[ns]`类型,以避免Pandas自动推断类型出现问题[^3]。 ```python import pandas as pd df = pd.read_csv('data.csv', dtype={'datetimenum': 'datetime64[ns]'}) ``` 2. **使用`pd.to_datetime`进行转换**:如果数据已经读入内存,但某些包含混合类型的数据,可以在读取后使用`pd.to_datetime`函数进行转换。此方法允许更灵活的日期时间解析,并且可以处理部分非标准格式的数据[^2]。 ```python df['datetimenum'] = pd.to_datetime(df['datetimenum']) ``` 3. **自定义日期解析器**:在读取CSV文件,如果数据中包含复杂的日期时间格式(如混合区的日期时间),可以通过`date_parser`参数指定一个自定义的解析函数。这可以通过部分应用`pandas.to_datetime`并设置`utc=True`来实现,从而确保所有日期时间都被正确解析为UTC时间。 ```python from functools import partial import pandas as pd date_parser = partial(pd.to_datetime, utc=True) df = pd.read_csv('data.csv', parse_dates=['datetimenum'], date_parser=date_parser) ``` 4. **预处理数据**:在某些情况下,原始数据可能包含无法直接转换为日期时间的整数(如6位数字日期或10位时间戳)。此可以在读取数据后,先对这些整数进行预处理,将其转换为标准的日期时间格式,然后再使用`pd.to_datetime`进行转换。 ```python def convert_int_to_datetime(x): if isinstance(x, int): # 假设x是6位数字日期 if 100000 <= x <= 999999: return pd.to_datetime(str(x), format='%Y%m%d') # 假设x是10位时间戳 elif 1000000000 <= x <= 9999999999: return pd.to_datetime(x, unit='s') return x df['datetimenum'] = df['datetimenum'].apply(convert_int_to_datetime) df['datetimenum'] = pd.to_datetime(df['datetimenum']) ``` 通过以上方法,可以有效地解决在数组中混合使用日期时间和整数出现的类型转换错误。这些方法不仅能够处理简单的日期时间转换,还能应对复杂的非标准格式和混合区的情况。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值