You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理数组中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数组执行以下操作:

  1. 过滤数组中的None值
  2. 将纳秒级时间戳转换为datetime对象(指定unit='ns'确保转换正确)
  3. 检查数组长度,确保能取到第二个和第三个元素
  4. 计算两个日期的天数差,返回是否满足≤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:11:20