在熊猫read_csv中以毫秒为单位解析日期

时间:2020-05-18 19:37:54

标签: python python-3.x pandas datetime parsing

我的.csv看起来像这样:

     date      time  
0    20190101  181555700  
1    20190101  181545515

其中YYYYMMDD的格式为dateHHMMSSMMM的格式为time(最后的MMM为毫秒)。例如,第一行为2019-01-01 18:15:55.700

是否有一种方法可以直接从pd.read_csv()进行解析,而不必稍后进行转换?仅使用parse_dates无效,因为它无法识别格式。我想要的是在数据框中添加一列,并正确解析时间戳,例如

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

2 个答案:

答案 0 :(得分:4)

您可以将to_timedeltaunit选项结合使用,将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 :(得分: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