在pandas read_csv中解析带毫秒的日期

2 投票
2 回答
2748 浏览
提问于 2025-06-18 04:02

我的 .csv 文件看起来是这样的:

     date      time  
0    20190101  181555700  
1    20190101  181545515

这里的日期格式是 YYYYMMDD,时间格式是 HHMMSSMMM(最后的 MMM 是毫秒)。比如第一行的数据是 2019-01-01 18:15:55.700

有没有办法直接通过 pd.read_csv() 来解析这些数据,而不需要后续再转换?单纯使用 parse_dates 是不行的,因为它无法识别这个格式。我希望在我的数据框中有一列,能够正确解析成时间戳,像这样:

    timestamp
0   2019-01-01 18:15:55.700

相关问题:

  • 暂无相关问题
暂无标签

2 个回答

5

你可以使用 to_timedelta 这个功能,并配合 unit 选项,把你的 time 转换成 timedelta,然后加到 date 上:

df = pd.read_csv('file.csv', parse_dates=['date'])
df['date'] = df.date + pd.to_timedelta(df.time, unit='ms')

或者:

df = pd.read_csv('file.csv')
df['date'] = pd.to_datetime(df.date) + pd.to_timedelta(df.time, unit='ms')

输出结果:

                     date       time
0 2019-01-03 02:25:55.700  181555700
1 2019-01-03 02:25:45.515  181545515

更新 根据评论:

df['date'] = pd.to_datetime(df.date.astype(str)+df.time.astype(str), format='%Y%m%d%H%M%S%f')

输出结果:

                     date       time
0 2019-01-01 18:15:55.700  181555700
1 2019-01-01 18:15:45.515  181545515
1

我觉得这差不多是你需要的:

import pandas as pd
import datetime as dt

data = pd.read_csv(
   './a.csv',
   delimiter='\t',
   index_col=0,
   parse_dates=[1],
   converters={'time': lambda t: dt.datetime.strptime(t, '%H%M%S%f').time()}
)

输出结果:

        date             time
0 2019-01-01  18:15:55.700000
1 2019-01-01  18:15:45.515000

经过一些调查,我发现了这个:

data = pd.read_csv(
   './a.csv',
   delimiter='\t',
   index_col=1,
   parse_dates={'datetime': [1, 2]},
   converters={'time': lambda t: dt.datetime.strptime(t, '%H%M%S%f').time()}
)

而输出结果是:

                 datetime
0 2019-01-01 18:15:55.700
1 2019-01-01 18:15:45.515

撰写回答