如何使用包含时间AM / PM格式的pandas.read_csv读取数据?

时间:2016-03-30 21:35:58

标签: python pandas datetime-format

我有以下数据集:

        Temp    Hi  Low Out Dew Wind    Wind    Wind    Hi  Hi  Wind    Heat    THW THSW            Rain    Solar   Solar   Hi Solar    Heat    Cool    In  In      Wind    Wind    ISS     Arc.
Date    Time    Out Temp    Temp    Hum Pt. Speed   Dir Run Speed   Dir Chill   Index   Index   Index   Bar     Rain    Rate    Rad.    Energy  Rad.    D-D     D-D     Temp    Hum ET  Samp    Tx  Recept  Int.
01/01/15    12:30 a 17.0    17.6    17.0    14  -10.7   30.6    N   15.29   51.5    N   15.7    14.1    10.8    8.3 741.4   0.00    0.0 0   0.00    0   0.028   0.000   26.2    2   0.00    702 1   100.0   30
01/01/15    1:00 a  16.6    17.0    16.6    14  -11.1   27.4    N   13.68   45.1    N   15.3    13.7    10.7    8.1 741.8   0.00    0.0 0   0.00    0   0.037   0.000   25.6    2   0.25    702 1   100.0   30
01/01/15    1:30 a  16.2    16.6    16.1    14  -11.4   24.1    N   12.07   35.4    N   15.0    13.4    10.7    7.9 741.9   0.00    0.0 0   0.00    0   0.044   0.000   25.1    2   0.00    703 1   100.0   30
01/01/15    2:00 a  15.6    16.2    15.6    14  -11.9   17.7    N   8.85    33.8    N   14.6    12.8    11.0    7.8 742.4   0.00    0.0 0   0.00    0   0.057   0.000   24.6    2   0.20    702 1   100.0   30
01/01/15    2:30 a  15.3    15.8    15.3    14  -12.1   16.1    N   8.05    29.0    N   14.4    12.6    11.0    7.7 742.8   0.00    0.0 0   0.00    0   0.063   0.000   24.2    2   0.00    703 1   100.0   30
01/01/15    3:00 a  14.8    15.3    14.8    15  -11.6   20.9    N   10.46   38.6    N   13.4    12.3    10.0    6.9 742.8   0.00    0.0 0   0.00    0   0.073   0.000   23.6    2   0.18    702 1   100.0   30

我正在尝试阅读它,但我遇到了时间格式的问题,因为你可以看到我有12:00,1:00 ......

我用它来读取另一个类似的文件(没有am / pm格式),如下所示:

data = pd.read_csv(filename, skiprows=2,sep='\s+', header=None,
                   index_col=[0,1,2],dayfirst=True, parse_dates=True,
                   infer_datetime_format=True)

我原以为我可以使用date_parser='%D/%M/%Y %I:%M'代替infer_datetime_format=True但是没有成功。

有些想法?

我尝试了这个,我认为有效,但是有一种方法可以直接从read_csv中读取它吗?

data = pd.read_csv(path+filename, skiprows=2,sep='\s+', header=None,
                  names=['date','hour','ap','a','b','c','d','e','f','g','h','i','j',
                         'k','l','m','n','o','p','q','r','s','t',
                         'u','v','w','x','y','z','aa','bb','cc'])

因此我创建了一个时间数组:

time = pd.to_datetime(data['date'] + ' ' + data['hour']+data['ap'])

data.index = time

1 个答案:

答案 0 :(得分:0)

您可以将parse_dates用于:

  

dict,例如{'foo':[1,3]} - >将列1,3解析为日期和调用   结果'foo'

和您的自定义date_parser功能

代码:

def parse_dt(dt, tm, ap):
    return pd.to_datetime(dt + ' ' + tm + ap, dayfirst=True)

df = pd.read_csv(filename, sep='\s+', skiprows=2, header=None,
                 parse_dates={'ts': [0,1,2] }, date_parser=parse_dt)

输出:

In [44]: df
Out[44]:
                   ts     3     4     5   6     7     8  9     10    11 ...  \
0 2015-01-01 00:30:00  17.0  17.6  17.0  14 -10.7  30.6  N  15.29  51.5 ...
1 2015-01-01 01:00:00  16.6  17.0  16.6  14 -11.1  27.4  N  13.68  45.1 ...
2 2015-01-01 01:30:00  16.2  16.6  16.1  14 -11.4  24.1  N  12.07  35.4 ...
3 2015-01-01 02:00:00  15.6  16.2  15.6  14 -11.9  17.7  N   8.85  33.8 ...
4 2015-01-01 02:30:00  15.3  15.8  15.3  14 -12.1  16.1  N   8.05  29.0 ...
5 2015-01-01 03:00:00  14.8  15.3  14.8  15 -11.6  20.9  N  10.46  38.6 ...

  22     23   24    25  26    27   28  29     30  31
0  0  0.028  0.0  26.2   2  0.00  702   1  100.0  30
1  0  0.037  0.0  25.6   2  0.25  702   1  100.0  30
2  0  0.044  0.0  25.1   2  0.00  703   1  100.0  30
3  0  0.057  0.0  24.6   2  0.20  702   1  100.0  30
4  0  0.063  0.0  24.2   2  0.00  703   1  100.0  30
5  0  0.073  0.0  23.6   2  0.18  702   1  100.0  30

[6 rows x 30 columns]