如何处理数组中Unix时间格式日期的计算与行筛选问题
问题描述
数据集
import pandas as pd df = pd.DataFrame([ ['B2', 'G2',[1291593600000000000, 1394755200000000000, 1397347200000000000, 1506816000000000000, 1509494400000000000, None]], ['B10', 'G10',[1291593600000000000, 1394755200000000000, 1460505600000000000, 1506816000000000000]], ['B14', 'G14',[1291593600000000000, 1394755200000000000, 1460505600000000000, 1506816000000000000]]], columns= ['Baum2', 'Baum7', 'value_pair'])
其中value_pair列的值为纳秒级Unix时间戳格式的日期。
需求
检查每行value_pair数组中特定两个日期的差值(例如第三个元素减第二个元素)是否超过70天,若超过则删除该行。
遇到的问题
- 直接对Unix时间转换格式失败,报错:
<class 'numpy.ndarray'> is not convertible to datetime - 转为
%Y-%m-%d字符串格式后无法执行减法运算,报错:TypeError: unsupported operand type(s) for -: 'numpy.str_' and 'numpy.str_'
尝试的代码
import pandas as pd df = pd.DataFrame([ ['B2', 'G2',[1291593600000000000, 1394755200000000000, 1397347200000000000, 1506816000000000000, 1509494400000000000, None]], ['B10', 'G10',[1291593600000000000, 1394755200000000000, 1460505600000000000, 1506816000000000000]], ['B14', 'G14',[1291593600000000000, 1394755200000000000, 1460505600000000000, 1506816000000000000]]], columns= ['Baum2', 'Baum7', 'value_pair']) df['value_pair'] = pd.to_datetime(df['value_pair']) df['value_pair'] = df['value_pair'].dt.strftime('%Y-%m-%d') erg1 = df['value_pair'][0][2]-df['value_pair'][0][1] print(df)
解决思路与代码
核心问题是value_pair为数组列,不能直接用pd.to_datetime批量处理整列,需对每个数组单独转换为datetime对象后再计算差值。
步骤1:定义行处理函数
对每行的value_pair数组执行以下操作:
- 过滤数组中的
None值 - 将纳秒级时间戳转换为datetime对象(指定
unit='ns'确保转换正确) - 检查数组长度,确保能取到第二个和第三个元素
- 计算两个日期的天数差,返回是否满足≤70天的判断结果
步骤2:应用函数筛选行
用apply将处理函数作用到每行,筛选出符合条件的行。
完整代码
import pandas as pd df = pd.DataFrame([ ['B2', 'G2',[1291593600000000000, 1394755200000000000, 1397347200000000000, 1506816000000000000, 1509494400000000000, None]], ['B10', 'G10',[1291593600000000000, 1394755200000000000, 1460505600000000000, 1506816000000000000]], ['B14', 'G14',[1291593600000000000, 1394755200000000000, 1460505600000000000, 1506816000000000000]]], columns= ['Baum2', 'Baum7', 'value_pair']) def check_date_diff(arr): # 过滤None值并转换为datetime对象 valid_dates = [pd.to_datetime(ts, unit='ns') for ts in arr if ts is not None] # 确保数组至少有3个有效元素(索引1和2对应第二、第三个元素) if len(valid_dates) < 3: return False # 可根据需求调整元素不足时的处理逻辑 # 计算天数差 diff_days = (valid_dates[2] - valid_dates[1]).days # 返回是否符合天数要求 return diff_days <= 70 # 筛选符合条件的行 filtered_df = df[df['value_pair'].apply(check_date_diff)] print(filtered_df)
代码说明
pd.to_datetime(ts, unit='ns'):明确指定时间戳单位为纳秒,避免因单位不匹配导致的转换错误- 先过滤
None值,避免转换时出现异常 - 增加数组长度检查,防止索引越界报错
- 通过
apply逐行处理数组,最终得到符合条件的数据集
内容的提问来源于stack exchange,提问作者pyflo
相关产品推荐
相关产品推荐

