新闻中心

Pandas中合并日期与时间列以避免转换错误

2025-11-18
浏览次数:
返回列表

pandas中合并日期与时间列以避免转换错误

在Pandas中将单独的日期和时间字符串列转换为`datetime`类型时,如果时间列不包含日期信息,`pd.to_datetime`默认会填充当前系统日期,导致日期部分被意外更改。本文将详细介绍如何通过字符串拼接或更推荐的日期时间与时间差组合方式,正确地将分散的日期和时间信息合并为一个完整的`datetime`对象,确保数据转换的准确性。

理解日期时间转换中的常见陷阱

在使用Pandas处理时间序列数据时,经常会遇到日期和时间信息存储在不同的列中的情况。例如,一个DataFrame可能包含一个order_date列(仅日期)和一个order_time列(仅时间)。当尝试将这些列转换为标准的datetime对象时,如果不采取正确的策略,可能会导致数据不一致。

考虑以下初始DataFrame:

import pandas as pd

data = {
    'order_details_id': [1, 2, 3, 4, 5],
    'order_id': [1, 2, 2, 2, 2],
    'order_date': ['1/1/23', '1/1/23', '1/1/23', '1/1/23', '1/1/23'],
    'order_time': ['11:38:36 AM', '11:57:40 AM', '11:57:40 AM', '11:57:40 AM', '11:57:40 AM'],
    'item_id': [109.0, 108.0, 124.0, 117.0, 129.0]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
print("\n原始数据类型:")
print(df.dtypes)

输出:

原始DataFrame:
   order_details_id  order_id order_date   order_time  item_id
0                 1         1     1/1/23  11:38:36 AM    109.0
1                 2         2     1/1/23  11:57:40 AM    108.0
2                 3         2     1/1/23  11:57:40 AM    124.0
3                 4         2     1/1/23  11:57:40 AM    117.0
4                 5         2     1/1/23  11:57:40 AM    129.0

原始数据类型:
order_details_id      int64
order_id              int64
order_date           object
order_time           object
item_id             float64
dtype: object

如果尝试单独转换order_date和order_time列,会发现order_time列在转换为datetime类型后,其日期部分被意外地更改为当前系统日期。

# 错误示范:单独转换时间列
df_copy = df.copy()
df_copy['order_date'] = pd.to_datetime(df_copy['order_date'])
df_copy['order_time'] = pd.to_datetime(df_copy['order_time'])
print("\n错误转换后的DataFrame (order_time日期被改变):")
print(df_copy)

输出(order_time的日期部分会显示为你运行代码时的日期,例如2025-12-29):

错误转换后的DataFrame (order_time日期被改变):
   order_details_id  order_id  order_date          order_time  item_id
0                 1         1  2025-01-01   2025-12-29 11:38:36    109.0
1                 2         2  2025-01-01   2025-12-29 11:57:40    108.0
2                 3         2  2025-01-01   2025-12-29 11:57:40    124.0
3                 4         2  2025-01-01   2025-12-29 11:57:40    117.0
4                 5         2  2025-01-01   2025-12-29 11:57:40    129.0

原因分析:order_time列的字符串(如"11:38:36 AM")仅包含时间信息,不包含日期。当pd.to_datetime函数在没有明确日期信息的情况下处理此类字符串时,它会默认使用当前系统日期来填充缺失的日期部分。这通常不是我们期望的行为,因为我们希望保留order_date列提供的原始日期。

正确合并日期与时间的方法

为了避免上述问题,我们应该在将数据转换为datetime类型之前,将日期和时间信息合并在一起。以下是几种推荐的方法。

方法一:字符串拼接后进行转换

最直观的方法是将order_date和order_time两列的字符串内容拼接成一个新的字符串列,然后对这个新列应用pd.to_datetime。

df_method1 = df.copy()
df_method1['order_datetime'] = pd.to_datetime(df_method1['order_date'].str.cat(df_method1['order_time'], sep=' '))
print("\n方法一:字符串拼接后转换:")
print(df_method1)
print("\n方法一:数据类型检查:")
print(df_method1.dtypes)

输出:

方法一:字符串拼接后转换:
   order_details_id  order_id order_date   order_time  item_id      order_datetime
0                 1         1     1/1/23  11:38:36 AM    109.0 2025-01-01 11:38:36
1                 2         2     1/1/23  11:57:40 AM    108.0 2025-01-01 11:57:40
2                 3         2     1/1/23  11:57:40 AM    124.0 2025-01-01 11:57:40
3                 4         2     1/1/23  11:57:40 AM    117.0 2025-01-01 11:57:40
4                 5         2     1/1/23  11:57:40 AM    129.0 2025-01-01 11:57:40

方法一:数据类型检查:
order_details_id             int64
order_id                     int64
order_date                  object
order_time                  object
item_id                    float64
order_datetime      datetime64[ns]
dtype: object

这种方法简单易懂,通过在日期和时间之间添加一个空格进行拼接,pd.to_datetime能够识别并正确解析。

Whimsical Whimsical

Whimsical推出的AI思维导图工具

Whimsical 182 查看详情 Whimsical

方法二:日期时间与时间差组合(推荐)

这种方法更为健壮和推荐,它将order_date转换为datetime对象,将order_time转换为timedelta(时间差)对象,然后将两者相加。这种方式避免了字符串操作可能带来的格式问题,并且在语义上更清晰。

df_method2 = df.copy()
# 将order_date转换为datetime类型
df_method2['order_date_dt'] = pd.to_datetime(df_method2['order_date'])
# 将order_time转换为timedelta类型
df_method2['order_time_td'] = pd.to_timedelta(df_method2['order_time'])

# 将datetime和timedelta相加
df_method2['order_datetime'] = df_method2['order_date_dt'] + df_method2['order_time_td']

# 可以选择删除中间列
df_method2 = df_method2.drop(columns=['order_date_dt', 'order_time_td'])

print("\n方法二:日期时间与时间差组合:")
print(df_method2)
print("\n方法二:数据类型检查:")
print(df_method2.dtypes)

为了更简洁,可以直接在赋值时使用pop()方法,这样可以同时删除原始列:

df_method2_pop = df.copy()
df_method2_pop['order_datetime'] = pd.to_datetime(df_method2_pop.pop('order_date')) + pd.to_timedelta(df_method2_pop.pop('order_time'))
print("\n方法二(使用pop()):日期时间与时间差组合:")
print(df_method2_pop)
print("\n方法二(使用pop()):数据类型检查:")
print(df_method2_pop.dtypes)

输出与方法一类似,但数据处理过程更为类型安全:

方法二:日期时间与时间差组合:
   order_details_id  order_id  item_id      order_datetime
0                 1         1    109.0 2025-01-01 11:38:36
1                 2         2    108.0 2025-01-01 11:57:40
2                 3         2    124.0 2025-01-01 11:57:40
3                 4         2    117.0 2025-01-01 11:57:40
4                 5         2    129.0 2025-01-01 11:57:40

方法二:数据类型检查:
order_details_id             int64
order_id                     int64
item_id                    float64
order_datetime      datetime64[ns]
dtype: object

这种方法不仅解决了日期被更改的问题,还提供了更清晰的数据类型转换路径:日期字符串转换为日期时间,时间字符串转换为时间差,然后相加得到完整的日期时间。

方法三:优化数据读取(如果可能)

如果数据源允许,最理想的情况是在数据导入时就将日期和时间作为一个整体字符串来读取。这样可以简化后续的转换步骤。

假设原始数据已经被预处理成如下格式:

data_combined = {
    'order_details_id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5},
    'order_id': {0: 1, 1: 2, 2: 2, 3: 2, 4: 2},
    'order_date_time': {0: '1/1/23 11:38:36 AM',
                        1: '1/1/23 11:57:40 AM',
                        2: '1/1/23 11:57:40 AM',
                        3: '1/1/23 11:57:40 AM',
                        4: '1/1/23 11:57:40 AM'},
    'item_id': {0: 109.0, 1: 108.0, 2: 124.0, 3: 117.0, 4: 129.0}
}
df_combined = pd.DataFrame(data_combined)
print("\n方法三:初始数据已合并日期时间:")
print(df_combined)

df_combined['order_dt'] = pd.to_datetime(df_combined['order_date_time'])
print("\n方法三:直接转换合并列:")
print(df_combined)
print("\n方法三:数据类型检查:")
print(df_combined.dtypes)

输出:

方法三:初始数据已合并日期时间:
   order_details_id  order_id     order_date_time  item_id
0                 1         1  1/1/23 11:38:36 AM    109.0
1                 2         2  1/1/23 11:57:40 AM    108.0
2                 3         2  1/1/23 11:57:40 AM    124.0
3                 4         2  1/1/23 11:57:40 AM    117.0
4                 5         2  1/1/23 11:57:40 AM    129.0

方法三:直接转换合并列:
   order_details_id  order_id     order_date_time  item_id            order_dt
0                 1         1  1/1/23 11:38:36 AM    109.0 2025-01-01 11:38:36
1                 2         2  1/1/23 11:57:40 AM    108.0 2025-01-01 11:57:40
2                 3         2  1/1/23 11:57:40 AM    124.0 2025-01-01 11:57:40
3                 4         2  1/1/23 11:57:40 AM    117.0 2025-01-01 11:57:40
4                 5         2  1/1/23 11:57:40 AM    129.0 2025-01-01 11:57:40

方法三:数据类型检查:
order_details_id             int64
order_id                     int64
order_date_time             object
item_id                    float64
order_dt            datetime64[ns]
dtype: object

这种方法最为简洁,因为pd.to_datetime可以直接处理包含完整日期和时间信息的字符串。

注意事项

  • 明确数据来源:在进行日期时间转换前,务必了解原始数据中日期和时间的存储方式。是单独存储,还是已经合并?
  • 格式参数:如果日期时间字符串的格式不标准或不一致,可以使用pd.to_datetime的format参数明确指定解析格式,例如 pd.to_datetime(series, format='%Y-%m-%d %H:%M:%S')。这有助于提高解析效率和准确性,尤其是在处理大量数据时。
  • 错误处理:pd.to_datetime的errors参数可以控制如何处理解析错误。'coerce'会将无法解析的值转换为NaT(Not a Time),而'raise'(默认)则会抛出错误。
  • 性能考量:对于大型数据集,字符串拼接(方法一)可能比timedelta方法(方法二)略慢,因为涉及到更多的字符串操作。方法二通过数值运算(datetime + timedelta)通常效率更高。

总结

在Pandas中处理分散的日期和时间列时,直接将不含日期信息的时间字符串转换为datetime类型会导致日期部分被当前系统日期覆盖。为了确保数据转换的准确性,推荐以下策略:

  1. 将日期和时间字符串拼接成一个完整的日期时间字符串,然后使用pd.to_datetime进行转换。
  2. 将日期列转换为datetime对象,将时间列转换为timedelta对象,然后将两者相加得到最终的datetime对象。 这种方法在类型安全性和性能方面通常更优。
  3. 如果数据源允许,在数据导入阶段就将日期和时间合并为一个字段,后续直接转换。

通过采用这些方法,您可以有效地管理和转换时间序列数据,避免常见的日期时间处理陷阱,确保数据分析的准确性和可靠性。

以上就是Pandas中合并日期与时间列以避免转换错误的详细内容,更多请关注其它相关文章!


# 无需注册  # seo环保级别  # 家用电器关键词优化排名  # 松岗关键词推广优化排名  # 招远企业网站推广  # 萝岗关键词seo排名  # 网站建设宣传资料模板  # 外贸网站推广费用高不高  # 茶叶的营销淘宝推广方案  # 美国主机seo好吗  # 网站建设简单吗  # ai  # 以避免  # 如何用  # 并为  # 可以直接  # 是在  # 离线  # 串列  # 这种方法  # 转换为 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  支付宝如何设置安全保护_支付宝安全设置的全面教程  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  React Router 嵌套组件中 URL 重定向问题的解决方案  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  知音漫客正版漫画平台_知音漫客官网账号登录  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  React列表渲染与独立状态管理:避免全局状态影响局部更新  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  126邮箱账号注册 电脑版登录入口  浏览器打开即用 美图秀秀网页版入口  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  铁路12306的积分有效期是多久_铁路12306积分有效期说明  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  J*aScript中安全有效地处理localStorage字符串数据  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  2026春节假期票务安排_2026春节放假购票指南  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  Android Studio计算器C键功能异常排查与修复教程  铃兰之剑为这和平的世界希里技能组及加点推荐  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  PHP URL参数传递与500错误调试指南  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  Win11怎么关闭快速启动_Win11彻底关机设置教程  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  c++20的std::jthread是什么_c++可中断线程与RAII式管理  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  mc.js免安装版 mc.js一键畅玩入口  最新韩小圈网页版登录入口_官网在线观看官方链接  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  如何更改在 Excel 中打开超链接时的默认浏览器 

搜索