2017-02-15 5 views
0

Ich habe eine Klasse geschrieben, die Pandas Datenrahmen verwendet, die bei bestimmten Frequenzen abgetastet werden. Die Argumente, die verwendet werden, um diese Frequenzen zu spezifizieren, sind die in Pandas gebräuchlichen frequency strings (zB 'H', '15min', 'D')Python Pandas Frequenz String Vergleiche

Eine meiner Methoden muss diese Frequenzen miteinander vergleichen - wie viele von eins passt in den anderen. Gibt es einen klugen, direkten Weg, dies zu tun? Ich schrieb die folgenden, aber es scheint so klobig und indirekt:

def _get_relative_timediff(self, freq1, freq2): 
    """ Returns how many (based on seconds) of frequency 2 goes into frequency 1 
    """ 
    old = pd.period_range(start='1/1/1900', freq=freq1, periods=2)[1].to_timestamp() 
    new = pd.period_range(start='1/1/1900', freq=freq2, periods=2)[1].to_timestamp() 

    old = (old - pd.to_datetime('1/1/1900')).seconds 
    new = (new - pd.to_datetime('1/1/1900')).seconds 

    relative = float(old/new) 

    return relative 

Es funktioniert:

my_object._get_relative_timediff('8H', 'min') 
480.0 

Aber ich muss sich vorstellen, gibt es eine bessere Art und Weise (oder sollte). Vielen Dank!

Antwort

1

pd.to_timedelta kann verwendet werden, um eine Str in einen Zeitraum zu konvertieren. Hier ein Beispiel:

import pandas as pd 
import re 

def to_timedelta(freq): 
    # Add '1' to freq that doesn't have any digit 
    if not bool(re.search(r'\d', freq)): 
     freq = '1{}'.format(freq) 

    # Convert str to datetime.timedelta 
    return pd.to_timedelta(freq) 

def get_relative_timediff(freq1, freq2): 
    return to_timedelta(freq1)/to_timedelta(freq2) 

print get_relative_timediff('8H', 'min') 
print get_relative_timediff('4D', '8H') 

Und Sie erhalten:

480.0 
12.0 

Hinweis Ich muss manuell eine ‚1‘ auf die Frequenz ohne Ziffern hinzufügen.

Verwandte Themen