Python 读取具有非标准时间戳列的大型csv文件

Python 读取具有非标准时间戳列的大型csv文件,python,pandas,datetime,Python,Pandas,Datetime,我正在尝试读取包含以下数据的csv文件: data.csv: time,value 12/31/2015 7:00:00 PM,275.9271 12/31/2015 7:00:02 PM,278.559 12/31/2015 7:00:10 PM,277.5949 12/31/2015 7:00:12 PM,270.0564 我的问题是有很多数据,如果我试图读取文件,同时告诉读者解析时间列,如: df = pd.read_csv('data.csv', parse_dates = ['ti

我正在尝试读取包含以下数据的csv文件:

data.csv:

time,value
12/31/2015 7:00:00 PM,275.9271
12/31/2015 7:00:02 PM,278.559
12/31/2015 7:00:10 PM,277.5949
12/31/2015 7:00:12 PM,270.0564
我的问题是有很多数据,如果我试图读取文件,同时告诉读者解析时间列,如:

df = pd.read_csv('data.csv', parse_dates = ['time'])
它非常慢。另一方面,如果我读取数据,然后尝试转换时间列,则速度也很慢:

df['time'] = pd.to_datetime(df.time)
环顾网络之后,解决方案似乎是指定时间的格式,但这失败了,因为月份和小时缺少零填充:

pd.to_datetime(df.time,format='%b/%d/%Y %H:%M:%S %p')
ValueError:时间数据“10/26/2016 7:00:01 PM”与格式“%b/%d/%Y%H:%M:%S%p”不匹配(匹配)


有没有办法使格式字符串与非标准数据匹配?或者加速一种自动识别方法?谢谢大家!

我认为
%b
应该是
%m

%b
Month作为区域设置的缩写名称

%m
月份为零填充十进制数

我发现自己经常回到这个网站:

或者只是Python文档:

示例

import pandas as pd

df = pd.DataFrame({'time': {0: '12/31/2015 7:00:00 PM',
                            1: '12/31/2015 7:00:02 PM',
                            2: '12/31/2015 7:00:10 PM',
                            3: '12/31/2015 7:00:12 PM'},
                   'value': {0: 275.9271, 1: 278.559, 2: 277.5949, 3: 270.0564}})

df['time'] = pd.to_datetime(df['time'], format='%m/%d/%Y %I:%M:%S %p')

#                  time     value
# 0 2015-12-31 19:00:00  275.9271
# 1 2015-12-31 19:00:02  278.5590
# 2 2015-12-31 19:00:10  277.5949
# 3 2015-12-31 19:00:12  270.0564

你的秒数是零。你的例子第10个月和第12个月永远不会是零填充的。在任何情况下,即使缺少预期的零填充,strtime也会尝试解析。你是对的,我的意思是说,小时,我会编辑问题。在大多数情况下,无论是否有填充空格,strtime都会正确处理。一个例外是没有分隔符的邮戳,这本身就很模糊。例如:
1012017
可能意味着
1/01/2017
10/1/2017
,甚至可能是
10/12/017
。但是人类也无法解析这些信息。
%H
也应该被
%I
替换H代表24小时制,但它使用的是am/pm。@HåkenLid很棒的一点,我错过了,但现在将更新答案!请记住将输出时间从7小时改为19小时。@PaulFleming很乐意帮忙!
import pandas as pd

df = pd.DataFrame({'time': {0: '12/31/2015 7:00:00 PM',
                            1: '12/31/2015 7:00:02 PM',
                            2: '12/31/2015 7:00:10 PM',
                            3: '12/31/2015 7:00:12 PM'},
                   'value': {0: 275.9271, 1: 278.559, 2: 277.5949, 3: 270.0564}})

df['time'] = pd.to_datetime(df['time'], format='%m/%d/%Y %I:%M:%S %p')

#                  time     value
# 0 2015-12-31 19:00:00  275.9271
# 1 2015-12-31 19:00:02  278.5590
# 2 2015-12-31 19:00:10  277.5949
# 3 2015-12-31 19:00:12  270.0564