Участок за каждые 10 минут в дате - PullRequest
6 голосов
/ 18 октября 2019

У 'df', который я использую, есть несколько строк для каждого datetime. Я хочу построить график рассеяния всех координат с одинаковым datetime для каждых 10 минут. Для каждого местоположения есть ввод данных, каждые 10 минут в df_data

Это работает, если я вручную ввожу время в t_list = [datetime(2017, 12, 23, 06, 00, 00), datetime(2017, 12, 23, 06, 10, 00), datetime(2017, 12, 23, 06, 20, 00)], но я хочу заменить это на что-то, использующее даты из dfпоэтому я могу использовать его для нескольких наборов данных.

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import numpy as np

df_data = pd.read_csv('C:\data.csv')
df_data['datetime'] = pd.to_datetime(df_data['TimeStamp'] )
df = df_data[(df_data['datetime']>= datetime(2017, 12, 23, 06,00, 00)) &
         (df_data['datetime']< datetime(2017, 12, 23, 07, 00, 00))]

##want a time array for all of the datetimes in the df
t_list = [datetime(2017, 12, 23, 06, 00, 00), datetime(2017, 12, 23, 06, 10, 00), 
datetime(2017, 12, 
23, 06, 20, 00)]

for t in t_list:
    t_end = t + timedelta(minutes = 10)
    t_text = t.strftime("%d-%b-%Y (%H:%M)")

    #boolean indexing with multiple conditions, you should wrap each single condition in brackets
    df_t = df[(df['datetime']>=t) & (df['datetime']<t_end)]

    #get data into variable
    ws = df_t['Sp_mean']
    lat = df_t['x']
    lon = df_t['y']
    col = 0.75

    #calc min/max for setting scale on images
    min_ws = df['Sp_mean'].min()
    max_ws = df['Sp_mean'].max()

    plt.figure(figsize=(15,10))
    plt.scatter(lon, lat, c=ws,s=300, vmin=min_ws, vmax=max_ws)  
    plt.title('event' + t_text,fontweight = 'bold',fontsize=18)
    plt.show()

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

date_arrray = np.arange(np.datetime64(df['datetime']))
df['timedelta'] = pd.to_timedelta(df['datetime'])

пример набора данных

enter image description here

Ответы [ 4 ]

0 голосов
/ 06 ноября 2019

Если я правильно понимаю, вы хотите сгруппировать свои данные по 10 минут. Если ваш набор данных уже выбран, вы можете просто сгруппировать данные по минутам и перебрать итоговые кадры данных.

minutes_dfs = df.groupby(df.datetime.map(lambda t: t.minute))

Если выборка еще не выполнена, вы можете создать группы по 10 минут

minutes_dfs = a.groupby(pd.Grouper(freq='10Min'))

Полный код:

# Example Data Frame
data = {'TimeStamp':['31/10/2017 23:50:00', '31/10/2017 23:50:00', '31/10/2017 23:50:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00'], 
        'datetime':['31/10/2017 23:50:00', '31/10/2017 23:50:00', '31/10/2017 23:50:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00', '31/10/2017 23:40:00'], 
        'x':[1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
        'y':[9, 8, 7, 9, 8, 7, 6, 5, 4, 3, 2, 1], 
        'Sp_mean':[6.49, 5.63, 7.07, 7.86, 7.27, 6.59, 6.78, 8.35, 6.3, 5.82, 8.74, 8.94]}
df = pd.DataFrame(data)
df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])
df['datetime'] = pd.to_datetime(df['datetime'])
df = df.set_index('datetime')
df['datetime'] = df.index
print(df)

#If data is already sampled
#minutes_dfs = df.groupby(df.datetime.map(lambda t: t.minute))

#Not sampled data
minutes_dfs = a.groupby(pd.Grouper(freq='10Min'))

for min, minutes in minutes_dfs:
  t_text = str(min)
  #get data into variable
  ws = minutes['Sp_mean']
  lat = minutes['x']
  lon = minutes['y']
  col = 0.75

  #calc min/max for setting scale on images
  min_ws = df['Sp_mean'].min()
  max_ws = df['Sp_mean'].max()

  plt.figure(figsize=(15,10))
  plt.scatter(lon, lat, c=ws,s=300, vmin=min_ws, vmax=max_ws)  
  plt.title('event' + t_text,fontweight = 'bold',fontsize=18)
  plt.show()
0 голосов
/ 01 ноября 2019

Я попробовал этот набор данных:

           datetime  x  y
0  31/10/2017 23:50  1  9
1  31/10/2017 23:50  1  9
2  31/10/2017 23:50  1  9
3  31/10/2017 23:40  1  9
4  31/10/2017 23:40  1  9
5  31/10/2017 23:40  1  9
6  31/10/2017 23:30  1  9
7  31/10/2017 23:30  1  9
8  31/10/2017 23:20  1  9

И этот код:

a = [["31/10/2017 23:50", 1,9],["31/10/2017 23:50", 1,9],["31/10/2017 23:50", 1,9],["31/10/2017 23:40", 1,9],["31/10/2017 23:40", 1,9],["31/10/2017 23:40", 1,9],["31/10/2017 23:30", 1,9],["31/10/2017 23:30", 1,9],["31/10/2017 23:20", 1,9]]
df = pd.DataFrame(a,columns=["TimeStamp","x","y"])
df["datetime"] = pd.to_datetime(df["TimeStamp"])
t_list = df.groupby("datetime").all().index
print(t_list)
# DatetimeIndex(['2017-10-31 23:20:00', '2017-10-31 23:30:00',
# ...                '2017-10-31 23:40:00', '2017-10-31 23:50:00'],
# ...               dtype='datetime64[ns]', name='datetime', freq=None)
0 голосов
/ 05 ноября 2019

надеюсь, это поможет

new_df = df.groupby('datetime')

for hour_group in new_df.groups:
    min_ws = new_df.get_group(i)['Sp_mean'].min()
    max_ws = new_df.get_group(i)['Sp_mean'].max()

    lat = new_df.get_group(i)['x']
    lon = new_df.get_group(i)['y']
    ws = new_df.get_group(i)['Sp_mean']

    plt.figure(figsize=(15,10))
    plt.scatter(lon, lat, c=ws,s=300, vmin=min_ws, vmax=max_ws)  
    plt.title('event' + hour_group.strftime('%Y-%m-%d %H:%M:%S'),
              fontweight ='bold',fontsize=18)

    plt.show()
0 голосов
/ 31 октября 2019

Швы, вы не знакомы с пандами. Вам следует проверить функцию повторной выборки .
Пусть df_data будут вашими необработанными данными:

# make a DatetimeIndex and resample it to 10-Min interval
df_data.index = pd.to_datetime(df_data['TimeStamp'])
resampled_data = df_data.resample('10Min')

# loop it:
min_ws = df['Sp_mean'].min()
max_ws = df['Sp_mean'].max()
col = 0.75
for start_time, sampled_df in resampled_data:
    ws = sampled_df['Sp_mean']
    lat = sampled_df['x']
    lon = sampled_df['y']
    plt.figure(figsize=(15,10))
    plt.scatter(lon, lat, c=ws,s=300, vmin=min_ws, vmax=max_ws)  
    plt.title('event' + start_time.strftime('%Y-%m-%d %H:%M:%S'),fontweight = 'bold',fontsize=18)
    plt.show()

...