Pandas read_fwf затрудняет интерпретацию строки, подобной дате

#python #pandas #date

#python #pandas #Дата

Вопрос:

Pandas read_fwf затрудняет интерпретацию строки, подобной дате

Я читаю несколько сотен файлов фиксированной ширины в базу данных postgresql, анализируя ее с помощью кода pandas read_fwf.

Мой камень преткновения — попытка извлечь конечную дату из периода из последних десяти столбцов одной из строк.

Пример файла можно найти по этой ссылке на веб-сайте NOAA:

Критический фрагмент кода из моего скрипта Python / pandas:

 import os
import time
import requests
import pandas as pd
import time
import datetime
from dateutil.parser import *

## Load adapters
import psycopg2
import psycopg2.extensions

df = pd.read_fwf(ddFname, header=None, )

if str(df[0:1]).find('COOLING') >= 0:
    amtType = 'CDD'
elif str(df[0:1]).find('HEATING') >= 0:
    amtType = 'HDD'

prDate = str(df[3:4])[-10:-1]
print(prDate)
  

Когда я вызываю последнюю строку, я получаю следующее:

 SEP 24,...
  

когда мне нужно следующее:

 SEP 24, 2016
  

Большое спасибо за любую помощь.

Комментарии:

1. Учитывая, что вы читаете его через fwf и на основе входного файла, похоже 2016 , что он был помещен в следующий столбец. Возможно, df[3:5] вместо df[3:4]

Ответ №1:

Используя файл примера, который вы опубликовали. Для меня работает следующее:

 df = pd.read_fwf(ddFname, header=None, )
str(df.at[4, 0])[-12:]
# Out[99]: 'SEP 24, 2016'
  

Когда вы делаете что-то вроде:

 str(df[3:5])
  

Вы вызываете __repr__ метод фрейма данных pandas. Метод repr часто усекает большие ячейки для удобства чтения (как это происходит в этом случае). В этом случае это выглядит так:

 repr(df[3:5])
Out[106]: '                                                   0    1n3                                                NaN  NaNn4  LAST DATE OF DATA COLLECTION PERIOD IS SEP 24,...  NaN'
  

и str(_)[-10:-1] дает:

 Out[107]: '4,...  Na'
  

Индексы между вашим файлом и моим не совсем совпадают, но, надеюсь, вы лучше понимаете, что здесь происходит. Использование at приведет к доступу к фактическому значению в определенной строке и столбце (значение не будет усечено).