pd.to_datetime()函数及pd.to_numeric函数

1.pd.to_datetime()

pd.to_datetime是Pandas库中的函数,可以将字符串转换为Timestamp格式,并且可以转换多种格式的时间字符串。

pd.to_datetime(arg, format=None, errors='raise', dayfirst=False, yearfirst=False, utc=None, box=True, exact=True, unit=None, infer_datetime_format=False, origin='unix')

参数包括:

  1. arg表示待转换的字符串;
  2. format表示待转换的字符串的格式描述;在format的格式字符串中,各种时间元素都有特定的字符表示,例如: %Y表示四位数的年份,%m表示两位数的月份,%d表示两位数的日期,%H表示小时数(24小时格式),%M表示分钟数,%S表示秒数。
  3. errors表示如果出现无法解析的字符串时会发生什么,raise表示引发异常,coerce表示转换为NaT(Not-a-Time)对象,ignore表示返回原始值。
  4. unit 参数用于指定输入数据的时间单位。它允许将输入的数据解释为不同时间精度的时间戳。下面是一些常用的 unit 参数选项及其含义:‘ns’:纳秒(默认值),‘us’:微秒,‘ms’:毫秒,‘s’:秒,‘m’:分钟,‘h’:小时,‘D’:天,‘M’:月,‘Y’:年

实战

import pandas as pd

# to_datetime用法
dates = pd.to_datetime(['2021/12/01', '2021/12/02', '2021/12/03'])
print(dates)

dates1 = pd.to_datetime(['2021/12/01', 'abc', '2021/12/03'],errors='coerce')
print(dates1)

DatetimeIndex(['2021-12-01', '2021-12-02', '2021-12-03'], dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2021-12-01', 'NaT', '2021-12-03'], dtype='datetime64[ns]', freq=None)

2.pd.to_numeric

pd.to_numeric函数主要用于将一个或一组值转换为数值类型。其基本语法如下:

pandas.to_numeric(arg, errors='raise', downcast=None)

参数包括:

  1. arg:需要转换的对象,可以是单个数值、列表、Series等。
  2. errors:控制非数值的处理方式,默认为’raise’,即抛出异常;其他选项包括’coerce’(将非数值强制转为NaN)和’ignore’(保持原值)。
  3. downcast:指定转换的数值类型,可以是’integer’、‘signed’、‘unsigned’、'float’等。

实战

import pandas as pd

data = ['1.1', '2.0', '3.3','a']

# 不指定downcast,保持原浮点数类型
result = pd.to_numeric(data,errors ='coerce')
print(result)

[1.1 2.  3.3 nan]
``` # 处理工期列中的"协商"文本(替换为0) merged_data['工期'] = pd.to_numeric(merged_data['工期'].replace('协商', -999), errors='coerce').fillna(-999) # # 处理空值 # merged_data['GongQiHuanBan'] = merged_data['GongQiHuanBan'].fillna(0) # 新增日期列转换 merged_data['HuanBanDate'] = pd.to_datetime(merged_data['HuanBanDate'], errors='coerce') merged_data['HuanBanReDate'] = pd.to_datetime(merged_data['HuanBanReDate'], errors='coerce') # 日期格式转换 merged_data['SADate'] = pd.to_datetime(merged_data['SADate']) merged_data['UpdateTime'] = pd.to_datetime(merged_data['UpdateTime']) holidays = [ # 元旦(不调休) '2025-01-01', # 周三 # 春节(调休2天) '2025-01-28', '2025-01-29', '2025-01-30', '2025-01-31', '2025-02-01', '2025-02-02', '2025-02-03', '2025-02-04', # 1.28(除夕)-2.4 # 清明节(不调休) '2025-04-04', '2025-04-05', '2025-04-06', # 周五-周日 # 劳动节(调休1天) '2025-05-01', '2025-05-02', '2025-05-03', '2025-05-04', '2025-05-05', # 周四-周一 # 端午节(不调休) '2025-05-31', '2025-06-01', '2025-06-02', # 周六-周一 # 中秋节+国庆节(调休2天) '2025-10-01', '2025-10-02', '2025-10-03', '2025-10-04', '2025-10-05', '2025-10-06', '2025-10-07', '2025-10-08' # 周三-下周三 ] holiday_dates = pd.to_datetime(holidays) # 新增调休工作日列表(转换为日期格式) workdays_adjustment = [ '2025-01-26', # 周日补春节 '2025-02-08', # 周六补春节 '2025-04-27', # 周日补劳动节 '2025-09-28', # 周日补国庆 '2025-10-11' # 周六补国庆 ] adjustment_dates = pd.to_datetime(workdays_adjustment) # 转换日期格式 def calculate_workdays(start_date, end_date): # 处理未结案情况 end_date = end_date if pd.notnull(end_date) else pd.Timestamp.now() # 生成日期序列 date_range = pd.date_range(start=start_date.normalize(), end=end_date.normalize(), freq='D') # 修改过滤条件(增加调休判断) workdays = [date for date in date_range if ( (date.weekday() < 5) or # 常规工作日 (date in adjustment_dates) # 调休补班日 ) and (date not in holiday_dates) # 排除法定假日 ] return len(workdays) def compute_huanban_days(row): start = row['HuanBanDate'] if pd.isnull(start): return 0 end = row['HuanBanReDate'] if pd.notnull(row['HuanBanReDate']) else pd.Timestamp.now() if start > end: return 0 return calculate_workdays(start, end) merged_data['GongQiHuanBan'] = merged_data.apply(compute_huanban_days, axis=1) # 计算总工期 merged_data['总工期'] = merged_data['工期'] + merged_data['GongQiHuanBan'] # 计算实际工作日 merged_data['实际工作日'] = merged_data.apply( lambda x: calculate_workdays(x['SADate'], x['UpdateTime']), axis=1 ) # 判断超时 merged_data['是否超时'] = '否' merged_data['超时天数'] = 0 mask = merged_data['实际工作日'] > merged_data['总工期'] merged_data.loc[mask, '是否超时'] = '是' merged_data.loc[mask, '超时天数'] = merged_data['实际工作日'] - merged_data['总工期']```当UpdateTime为空时,代码是否获取程序运行时间来作为UpdateTime参与计算
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值