2016-03-01 2 views
2

Я пытаюсь прочитать во многих файлах. Каждый файл представляет собой ежедневный файл данных с данными каждые 10 минут. данные в каждом файле вроде «фрагментированное вверх», как это:Чтение в определенные строки даты из файла с pandas python

2015-11-08 00:10:00 00:10:00 
# z speed dir  W sigW  bck error 
30 3.32 111.9 0.15 0.12 1.50E+05  0 
40 3.85 108.2 0.07 0.14 7.75E+04  0 
50 4.20 107.9 0.06 0.15 4.73E+04  0 
60 4.16 108.5 0.03 0.19 2.73E+04  0 
70 4.06 93.6 0.03 0.23 9.07E+04  0 
80 4.06 93.8 0.07 0.28 1.36E+05  0 

2015-11-08 00:20:00 00:10:00 
# z speed dir  W sigW  bck error 
30 3.79 120.9 0.15 0.11 7.79E+05  0 
40 4.36 115.6 0.04 0.13 2.42E+05  0 
50 4.71 113.6 0.07 0.14 6.84E+04  0 
60 5.00 113.3 0.13 0.17 1.16E+04  0 
70 4.29 94.2 0.22 0.20 1.38E+05  0 
80 4.54 94.1 0.11 0.25 1.76E+05  0 

2015-11-08 00:30:00 00:10:00 
# z speed dir  W sigW  bck error 
30 3.86 113.6 0.13 0.10 2.68E+05  0 
40 4.34 116.1 0.09 0.11 1.41E+05  0 
50 5.02 112.8 0.04 0.12 7.28E+04  0 
60 5.36 110.5 0.01 0.14 5.81E+04  0 
70 4.67 95.4 0.14 0.16 7.69E+04  0 
80 4.56 95.0 0.15 0.21 9.84E+04  0 

... 

Файл продолжается, как это каждые 10 минут на весь день. Имя файла для этого файла - 151108.mnd. Я хочу, чтобы мой код читался во всех файлах, которые для новичка так 1511 ?? .ndnd, и я хочу, чтобы мой код читал в каждом дневном файле целый месяц, хватал все строки datetime, так что пример частичного файла данных, который я только что показал Я бы хотел, чтобы мой код хватал 2015-11-08 00:10:00, 2015-11-08 00:20:00, 2015-11-08 00:30:00 и т. Д. Хранить как переменные, а затем перейти к на следующий день (151109.mnd) и захватить все строки даты и времени и сохранить в качестве переменной даты и добавить к ранее сохраненным датам. И так далее и т. Д. Весь месяц. Вот код, который я до сих пор:

import pandas as pd 
import glob 
import datetime 

filename = glob.glob('1511??.mnd') 
data_nov15_hereford = pd.DataFrame() 
frames = [] 
dates = [] 
counter = 1 
for i in filename: 
    f_nov15_hereford = pd.read_csv(i, skiprows = 32) 
    for line in f_nov15_hereford: 
     if line.startswith("20"): 
      print line 
      date_object = datetime.datetime.strptime(line[:-6], '%Y-%m-%d %H:%M:%S %f') 
      dates.append(date_object) 
      counter = 0 
     else: 
      counter += 1 
    frames.append(f_nov15_hereford) 
data_nov15_hereford = pd.concat(frames,ignore_index=True) 
data_nov15_hereford = data_nov15_hereford.convert_objects(convert_numeric=True) 


print dates 

Этот код имеет некоторые проблемы, так как при печати даты он печатает две копии каждой даты, и он также выводит только первую дату каждого файла так 2015-11 -08 00:10:00, 2015-11-09 00:10:00 и т. Д. Это не происходит по очереди в каждом файле, а затем, когда все даты в этом файле хранятся, переходят к следующему файлу, например Я хочу. Вместо этого он просто захватывает первую дату в каждом файле. Любая помощь по этому коду? Есть ли более простой способ сделать то, что я хочу? Благодаря!

ответ

1

Несколько наблюдений:

Первый: Почему вы только получаете первую дату в файле:

f_nov15_hereford = pd.read_csv(i, skiprows = 32) 
for line in f_nov15_hereford: 
    if line.startswith("20"): 

Первая строка считывает файл в панд dataframe. Вторая строка выполняет итерацию по столбцам кадра данных, а не по строкам. В результате последняя строка проверяет, начинается ли столбец с «20». Это происходит только один раз для каждого файла.

Второе: counter инициализируется, и его значение изменяется, но оно никогда не используется. Я предполагаю, что он предназначен для использования в пропуске строк в файлах.

В-третьих: Возможно, было бы проще собрать все даты в список Python и затем преобразовать их в рамку данных pandas, если это необходимо.

import pandas as pd 
import glob 
import datetime as dt 

# number of lines to skip before the first date 
offset = 32 

# number of lines from one date to the next 
recordlength = 9 

pattern = '1511??.mnd' 

dates = [] 

for filename in glob.iglob(pattern): 

    with open(filename) as datafile: 

     count = -offset 
     for line in datafile: 
      if count == 0: 
       fmt = '%Y-%m-%d %H:%M:%S %f' 
       date_object = dt.datetime.strptime(line[:-6], fmt) 
       dates.append(date_object) 

      count += 1 

      if count == recordlength: 
       count = 0 

data_nov15_hereford = pd.DataFrame(dates, columns=['Dates']) 

print dates 
+0

Это, кажется, отлично работает! Моя единственная жалоба заключается в том, что когда я печатаю даты, она все равно дает мне 2 набора. Или если я напечатаю np.форма (даты) Я получаю две формы (2046L,) (2046L,) – HM14

+0

Ничего, я думаю, что это проблема с моим ноутбуком, а не с кодом! Спасибо! – HM14

1

Рассмотрите возможность изменения данных csv по строкам до чтения в качестве кадра данных. Ниже открывается исходный файл в списке glob и записывается в файл temp, перемещая даты до последнего столбца, удаляя несколько заголовков и пустые строки.

CSV данных (предполагается, что текст вид CSV файл выглядит, как показано ниже, если он отличается от фактической, настроить код ру)

2015-11-0800:10:0000:10:00,,,,,, 
z,speed,dir,W,sigW,bck,error 
30,3.32,111.9,0.15,0.12,1.50E+05,0 
40,3.85,108.2,0.07,0.14,7.75E+04,0 
50,4.2,107.9,0.06,0.15,4.73E+04,0 
60,4.16,108.5,0.03,0.19,2.73E+04,0 
70,4.06,93.6,0.03,0.23,9.07E+04,0 
80,4.06,93.8,0.07,0.28,1.36E+05,0 
,,,,,, 
2015-11-0800:10:0000:20:00,,,,,, 
z,speed,dir,W,sigW,bck,error 
30,3.79,120.9,0.15,0.11,7.79E+05,0 
40,4.36,115.6,0.04,0.13,2.42E+05,0 
50,4.71,113.6,0.07,0.14,6.84E+04,0 
60,5,113.3,0.13,0.17,1.16E+04,0 
70,4.29,94.2,0.22,0.2,1.38E+05,0 
80,4.54,94.1,0.11,0.25,1.76E+05,0 
,,,,,, 
2015-11-0800:10:0000:30:00,,,,,, 
z,speed,dir,W,sigW,bck,error 
30,3.86,113.6,0.13,0.1,2.68E+05,0 
40,4.34,116.1,0.09,0.11,1.41E+05,0 
50,5.02,112.8,0.04,0.12,7.28E+04,0 
60,5.36,110.5,0.01,0.14,5.81E+04,0 
70,4.67,95.4,0.14,0.16,7.69E+04,0 
80,4.56,95,0.15,0.21,9.84E+04,0 

Python Script

import glob, os 
import pandas as pd 

filenames = glob.glob('1511??.mnd') 
temp = 'temp.csv' 

# INITIATE EMPTY DATAFRAME 
data_nov15_hereford = pd.DataFrame(columns=['z', 'speed', 'dir', 'W', 
              'sigW', 'bck', 'error', 'date']) 

# ITERATE THROUGH EACH FILE IN GLOB LIST 
for file in filenames:   
    # DELETE PRIOR TEMP VERSION      
    if os.path.exists(temp): os.remove(temp) 

    header = 0 
    # READ IN ORIGINAL CSV 
    with open(file, 'r') as txt1: 
     for rline in txt1: 
      # SAVE DATE VALUE THEN SKIP ROW 
      if "2015-11" in rline: date = rline.replace(',',''); continue 

      # SKIP BLANK LINES (CHANGE IF NO COMMAS)    
      if rline == ',,,,,,\n': continue 

      # ADD NEW 'DATE' COLUMN AND SKIP OTHER HEADER LINES 
      if 'z,speed,dir,W,sigW,bck,error' in rline: 
       if header == 1: continue 
       rline = rline.replace('\n', ',date\n') 
       with open(temp, 'a') as txt2: 
        txt2.write(rline) 
       continue 
      header = 1 

      # APPEND LINE TO TEMP CSV WITH DATE VALUE 
      with open(temp, 'a') as txt2: 
       txt2.write(rline.replace('\n', ','+date)) 

    # APPEND TEMP FILE TO DATA FRAME 
    data_nov15_hereford = data_nov15_hereford.append(pd.read_csv(temp)) 

Выход

 z speed dir  W sigW  bck error      date 
0 30 3.32 111.9 0.15 0.12 150000  0 2015-11-0800:10:0000:10:00 
1 40 3.85 108.2 0.07 0.14 77500  0 2015-11-0800:10:0000:10:00 
2 50 4.20 107.9 0.06 0.15 47300  0 2015-11-0800:10:0000:10:00 
3 60 4.16 108.5 0.03 0.19 27300  0 2015-11-0800:10:0000:10:00 
4 70 4.06 93.6 0.03 0.23 90700  0 2015-11-0800:10:0000:10:00 
5 80 4.06 93.8 0.07 0.28 136000  0 2015-11-0800:10:0000:10:00 
6 30 3.79 120.9 0.15 0.11 779000  0 2015-11-0800:10:0000:20:00 
7 40 4.36 115.6 0.04 0.13 242000  0 2015-11-0800:10:0000:20:00 
8 50 4.71 113.6 0.07 0.14 68400  0 2015-11-0800:10:0000:20:00 
9 60 5.00 113.3 0.13 0.17 11600  0 2015-11-0800:10:0000:20:00 
10 70 4.29 94.2 0.22 0.20 138000  0 2015-11-0800:10:0000:20:00 
11 80 4.54 94.1 0.11 0.25 176000  0 2015-11-0800:10:0000:20:00 
12 30 3.86 113.6 0.13 0.10 268000  0 2015-11-0800:10:0000:30:00 
13 40 4.34 116.1 0.09 0.11 141000  0 2015-11-0800:10:0000:30:00 
14 50 5.02 112.8 0.04 0.12 72800  0 2015-11-0800:10:0000:30:00 
15 60 5.36 110.5 0.01 0.14 58100  0 2015-11-0800:10:0000:30:00 
16 70 4.67 95.4 0.14 0.16 76900  0 2015-11-0800:10:0000:30:00 
17 80 4.56 95.0 0.15 0.21 98400  0 2015-11-0800:10:0000:30:00 
+0

Это очень полезно! Благодаря! – HM14

Смежные вопросы