Python 使用毫秒解析三个字段中的日期

Python 使用毫秒解析三个字段中的日期,python,pandas,csv,datetime,Python,Pandas,Csv,Datetime,我有一个csv文件,有多列,其中一列是日期,下一列是时间,还有一列是毫秒,如下所示: DATE TIME MSEC 0 13/01/2017 08:49:37 805102 1 13/01/2017 08:49:09 675839 2 13/01/2017 08:39:03 50614 3 13/01/2017 08:38:30 383081 现在我真的印象深刻,我可以使用熊猫组合日期

我有一个csv文件,有多列,其中一列是日期,下一列是时间,还有一列是毫秒,如下所示:

    DATE        TIME        MSEC 
0   13/01/2017  08:49:37    805102    
1   13/01/2017  08:49:09    675839    
2   13/01/2017  08:39:03    50614    
3   13/01/2017  08:38:30    383081
现在我真的印象深刻,我可以使用熊猫组合日期和时间时,阅读csv文件,如

pd.read_csv(r"~/file.csv", parse_dates=[["DATE","TIME"]])

但我似乎无法在毫秒内挤出时间。由于该文件相当大,如果这可以在read_csv中完成,而不是在连续步骤中完成,我将非常感激

更新:读取CSV时动态分析不同列的日期:

In [181]: pd.read_csv(fn, 
                      date_parser=lambda d,t,ms: d + ' ' + t + '.' + ms, 
                      parse_dates={'Timestamp':['DATE','TIME','MSEC']})
Out[181]:
                   Timestamp
0 2017-01-13 08:49:37.805102
1 2017-01-13 08:49:09.675839
2 2017-01-13 08:39:03.506140
3 2017-01-13 08:38:30.383081

旧答案:

In [186]: df = pd.concat([df] * 10**3, ignore_index=True)

In [187]: df.shape
Out[187]: (4000, 3)

In [188]: df.to_csv(fn, index=False)

In [189]: pd.options.display.max_rows = 6

In [190]: df
Out[190]:
            DATE      TIME    MSEC
0     13/01/2017  08:49:37  805102
1     13/01/2017  08:49:09  675839
2     13/01/2017  08:39:03   50614
...          ...       ...     ...
3997  13/01/2017  08:49:09  675839
3998  13/01/2017  08:39:03   50614
3999  13/01/2017  08:38:30  383081

[4000 rows x 3 columns]

In [191]: %%timeit
     ...: pd.read_csv(fn,
     ...:             date_parser=lambda d,t,ms: d + ' ' + t + '.' + ms,
     ...:             parse_dates={'Timestamp':['DATE','TIME','MSEC']})
     ...:
1 loop, best of 3: 3.31 s per loop

In [192]: %%timeit
     ...: df = pd.read_csv(fn)
     ...: df['TimeStamp'] = pd.to_datetime(df.pop('DATE') + ' ' +
     ...:                                  df.pop('TIME') + '.' +
     ...:                                  df.pop('MSEC').astype(str),
     ...:                                  format='%d/%m/%Y %H:%M:%S.%f')
     ...:
10 loops, best of 3: 122 ms per loop
首先按原样阅读您的CSV:

df = pd.read_csv(r"~/file.csv")

In [170]: df
Out[170]:
         DATE      TIME    MSEC
0  13/01/2017  08:49:37  805102
1  13/01/2017  08:49:09  675839
2  13/01/2017  08:39:03   50614
3  13/01/2017  08:38:30  383081

In [171]: df.dtypes
Out[171]:
DATE    object
TIME    object
MSEC     int64
dtype: object
现在我们可以将其转换为:

In [172]: df['TimeStamp'] = pd.to_datetime(df.DATE + ' ' + df.TIME + '.' + df.MSEC.astype(str), format='%d/%m/%Y %H:%M:%S.%f')

In [173]: df
Out[173]:
         DATE      TIME    MSEC                  TimeStamp
0  13/01/2017  08:49:37  805102 2017-01-13 08:49:37.805102
1  13/01/2017  08:49:09  675839 2017-01-13 08:49:09.675839
2  13/01/2017  08:39:03   50614 2017-01-13 08:39:03.506140
3  13/01/2017  08:38:30  383081 2017-01-13 08:38:30.383081


In [174]: df.dtypes
Out[174]:
DATE                 object
TIME                 object
MSEC                  int64
TimeStamp    datetime64[ns]
dtype: object
计时:

In [186]: df = pd.concat([df] * 10**3, ignore_index=True)

In [187]: df.shape
Out[187]: (4000, 3)

In [188]: df.to_csv(fn, index=False)

In [189]: pd.options.display.max_rows = 6

In [190]: df
Out[190]:
            DATE      TIME    MSEC
0     13/01/2017  08:49:37  805102
1     13/01/2017  08:49:09  675839
2     13/01/2017  08:39:03   50614
...          ...       ...     ...
3997  13/01/2017  08:49:09  675839
3998  13/01/2017  08:39:03   50614
3999  13/01/2017  08:38:30  383081

[4000 rows x 3 columns]

In [191]: %%timeit
     ...: pd.read_csv(fn,
     ...:             date_parser=lambda d,t,ms: d + ' ' + t + '.' + ms,
     ...:             parse_dates={'Timestamp':['DATE','TIME','MSEC']})
     ...:
1 loop, best of 3: 3.31 s per loop

In [192]: %%timeit
     ...: df = pd.read_csv(fn)
     ...: df['TimeStamp'] = pd.to_datetime(df.pop('DATE') + ' ' +
     ...:                                  df.pop('TIME') + '.' +
     ...:                                  df.pop('MSEC').astype(str),
     ...:                                  format='%d/%m/%Y %H:%M:%S.%f')
     ...:
10 loops, best of 3: 122 ms per loop

结论:对于4000行数据集,按原样读取CSV和从数据帧解析数据快了27倍。

非常酷,谢谢——但是在read_CSV中有什么方法可以做到这一点吗?@Magellan88,很可能是的,但我认为与这种方法相比,它会慢一些…@Magellan88,你想在结尾只有一列吗?理想情况下是的,我也想有其他列,但这三列应该是结尾的一列。@Magellan88,不客气。请检查我添加的时间比较。正如我之前所说,旧的答案要快得多……)