Извлечение данных, относящихся к дню, из заданного диапазона дат в наборе данных - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть набор данных с диапазоном дат с 12 января по 3 августа 2018 года с некоторыми значениями:

enter image description here

Размерность my_df DataFrame:

my_df.shape 
(9752, 2)

Каждая строка содержит частоту получаса

Первый ряд начинается в 2018-01-12

my_df.iloc[0]
Date:       2018-01-12 00:17:28
Value                      1
Name: 0, dtype: object

И последний ряд заканчивается на 2018-08-03

my_df.tail(1)
                  Date:     Value
9751    2018-08-03 23:44:59  1

Моя цель - выбрать строки данных, соответствующие каждому дню, и экспортировать их в файл CSV.

Чтобы получить только данные за 12 января и сохранить в читаемый файл, я выполняю:

# Selecting data value of each day
my_df_Jan12 = my_df[(my_df['Fecha:']>='2018-01-12 00:00:00') 
              & 
              (my_df['Fecha:']<='2018-01-12 23:59:59')
                                   ]
my_df_Jan12.to_csv('Data_Jan_12.csv', sep=',', header=True, index=False)

С 12 января по 03 августа 203 дня (28 недель)

Я не хочу выполнять этот запрос каждый день вручную, тогда я пытаюсь выполнить следующий базовый анализ:

  • Мне нужно сгенерировать 203 файла (по 1 файлу в день)
  • День января, начинающийся 12 (12 января)
  • Январь - первый месяц (01), а август - восьмой месяц (08)

Тогда:

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

В соответствии с вышеизложенным, я пробую этот подход:

# Selecting data value of each day (203 days)
for i in range(203):
    for j in range(1,9): # month
        for k in range(12,32): # days of the month
            values = my_df[(my_df['Fecha:']>='2018-0{}-{} 00:00:00'.format(j,k)) 
            &  
            (my_df['Fecha:']<='2018-0{}-{} 23:59:59'.format(j,k))]
            values.to_csv('Values_day_{}.csv'.format(i), sep=',', header=True, index=False)

Но у меня есть проблема в том смысле, что когда я повторяю range(12,32) в днях месяцев, это range(12,32) относится только к первому январскому месяцу, я так думаю ...

Наконец-то я получаю 203 пустых файла CSV из-за чего-то, что я делаю неправильно ...

Как я могу решить эту небольшую проблему подходящим способом? Любая ориентация высоко ценится

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

groupby

for date, d in df.groupby(pd.Grouper(key='Date', freq='D')):
  d.to_csv(f"Data_{date:%b_%d}.csv", index=False)

Обратите внимание, я использовал f-строку Python 3.6 +
В противном случае используйте это

for date, d in df.groupby(pd.Grouper(key='Date', freq='D')):
  d.to_csv("Data_{:%b_%d}.csv".format(date), index=False)

Рассмотрим df

df = pd.DataFrame(dict(
    Date=pd.date_range('2010-01-01', periods=10, freq='12H'),
    Value=range(10)
))

Тогда

for date, d in df.groupby(pd.Grouper(key='Date', freq='D')):
  d.to_csv(f"Data_{date:%b_%d}.csv", index=False)

И проверить

from pathlib import Path

print(*map(Path.read_text, Path('.').glob('Data*.csv')), sep='\n')

Date,Value
2010-01-05 00:00:00,8
2010-01-05 12:00:00,9

Date,Value
2010-01-04 00:00:00,6
2010-01-04 12:00:00,7

Date,Value
2010-01-02 00:00:00,2
2010-01-02 12:00:00,3

Date,Value
2010-01-01 00:00:00,0
2010-01-01 12:00:00,1

Date,Value
2010-01-03 00:00:00,4
2010-01-03 12:00:00,5
0 голосов
/ 10 сентября 2018

Как то так? Я переименовал ваш исходный столбец с Date: на Timestamp. Я также предполагаю, что ваша серия Date: - это серия панд DateTime.

my_df.columns = ['Timestamp', 'Value']
my_df['Date'] = my_df['Timestamp'].apply(lambda x: x.date())
dates = my_df['Date'].unique()
for date in dates:
    f_name = str(date) + '.csv'
    my_df[my_df['Date'] == date].to_csv(f_name)
...