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

如何使用pd.to_datetime调整DataFrame中时间列的日期?

解决方案

问题分析

你之前的尝试失败是因为pd.to_datetime(test['Date'].dt.date)和pd.to_datetime(test['WakeUp'].dt.time)都是datetime对象,pandas不支持直接相加两个datetime。正确的做法是将时间转为时间差(timedelta)后与日期相加,或者直接拼接日期和时间字符串再转datetime,同时处理跨天的时间(如00:10这类属于次日的时间)。

方法一:时间差(Timedelta)合并法

这种方法先将时间转为timedelta,再与日期列相加,同时判断跨天时间并调整日期:

import pandas as pd

# 加载你的数据(示例)
df = pd.DataFrame({
    'Unnamed: 1': ['2022-09-06', '2022-09-07', '2022-09-08', '2022-09-09'],
    'Unnamed: 2': ['08:03:00', '07:30:00', '08:30:00', '08:56:00'],
    'Unnamed: 3': ['12:09:00', '12:20:00', '12:15:00', '11:00:00'],
    'Unnamed: 4': ['20:19:00', '20:35:00', '21:30:00', '23:00:00'],
    'Unnamed: 5': ['22:35:00', '00:10:00', '00:33:00', '02:00:00']
})

# 重命名列,方便操作
df.columns = ['Date', 'WakeUp', '1stMeal', '2ndMeal', 'Sleep']

# 转换日期列为datetime类型
df['Date'] = pd.to_datetime(df['Date'])

# 定义合并日期和时间的函数,自动处理跨天情况
def merge_date_time(date_col, time_str):
    # 将时间字符串转为timedelta
    time_delta = pd.to_timedelta(time_str)
    # 初始合并日期与时间
    combined_dt = date_col + time_delta
    # 判断:如果时间小于6小时(属于次日作息,比如凌晨睡觉),则日期加1天
    # 可根据你的实际需求调整这个阈值(比如改为3小时)
    cross_day_mask = time_delta < pd.Timedelta('6 hours')
    combined_dt.loc[cross_day_mask] += pd.Timedelta(days=1)
    return combined_dt

# 批量处理所有时间列
df['WakeUp'] = merge_date_time(df['Date'], df['WakeUp'])
df['1stMeal'] = merge_date_time(df['Date'], df['1stMeal'])
df['2ndMeal'] = merge_date_time(df['Date'], df['2ndMeal'])
df['Sleep'] = merge_date_time(df['Date'], df['Sleep'])

方法二:字符串拼接法

直接将日期字符串和时间字符串拼接,转成datetime后再调整跨天日期:

import pandas as pd

# 加载并预处理数据
df = pd.DataFrame({
    'Unnamed: 1': ['2022-09-06', '2022-09-07', '2022-09-08', '2022-09-09'],
    'Unnamed: 2': ['08:03:00', '07:30:00', '08:30:00', '08:56:00'],
    'Unnamed: 3': ['12:09:00', '12:20:00', '12:15:00', '11:00:00'],
    'Unnamed: 4': ['20:19:00', '20:35:00', '21:30:00', '23:00:00'],
    'Unnamed: 5': ['22:35:00', '00:10:00', '00:33:00', '02:00:00']
})

df.columns = ['Date', 'WakeUp', '1stMeal', '2ndMeal', 'Sleep']
df['Date'] = pd.to_datetime(df['Date'])

# 拼接日期和时间字符串,转成datetime
df['WakeUp'] = pd.to_datetime(df['Date'].astype(str) + ' ' + df['WakeUp'])
df['1stMeal'] = pd.to_datetime(df['Date'].astype(str) + ' ' + df['1stMeal'])
df['2ndMeal'] = pd.to_datetime(df['Date'].astype(str) + ' ' + df['2ndMeal'])
df['Sleep'] = pd.to_datetime(df['Date'].astype(str) + ' ' + df['Sleep'])

# 调整跨天的睡眠时间:如果小时数小于6,日期加1天
sleep_cross_day_mask = df['Sleep'].dt.hour < 6
df.loc[sleep_cross_day_mask, 'Sleep'] += pd.Timedelta(days=1)

效果验证

处理后的数据会变成:

Date               WakeUp              1stMeal              2ndMeal                Sleep
0 2022-09-06 2022-09-06 08:03:00 2022-09-06 12:09:00 2022-09-06 20:19:00 2022-09-06 22:35:00
1 2022-09-07 2022-09-07 07:30:00 2022-09-07 12:20:00 2022-09-07 20:35:00 2022-09-08 00:10:00
2 2022-09-08 2022-09-08 08:30:00 2022-09-08 12:15:00 2022-09-08 21:30:00 2022-09-09 00:33:00
3 2022-09-09 2022-09-09 08:56:00 2022-09-09 11:00:00 2022-09-09 23:00:00 2022-09-10 02:00:00

内容的提问来源于stack exchange,提问作者Casentive

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:35:26