2017-11-02 14 views
0

日付オブジェクトX( "%Y、%m、%d")と日付Yのリストを持っていて、その中のすべての日付が+ date年を無視します。python3日付を反復する

Ex.: 
timeDelta = 10days 
X = [2017-10-10, 2014-09-31, 1999-05-10, 1992-10-18] 
Y = 2019-10-05 
Z = MyFunction(X, Y, delta) 


MyFunction(X,Y, timeDelta): 
for i in range((currentDate-500000),currentDate,10000): # last 50 years in 1 year steps 
    bottomBoundries.append(datetime.strptime(str(i),'%Y%m%d')-timedelta(timeDelta)) 
    topBoundries.append(datetime.strptime(str(i),'%Y%m%d')+timedelta(timeDelta)) 
for i in range(0, pandas.shape[0], 1): 
    for j in range(0, len(bottomBoundries) , 1): 
      if ((pandas["MESS_DATUM"].iloc[i] > bottomBoundries[j]) & (pandas["MESS_DATUM"].iloc[i] < topBoundries[j])): 
       indices.append(i) 
result = pandas.iloc[indices] 
return result 

これは時間がかかり、より効率的にする方法を知りました。

+0

「2014-09-31」は有効な日付ではありません。また、最初の数行はPythonの正しい構文ではありません。日付を文字列として記述する必要があります。 –

答えて

0

あなたはこのような何かがうまくいくかもしれないので、年に一日を取得するために

timetuple().ydayを使用することができます。

def diff_without_year(date, reference_date, timedelta): 
    ref_yday = reference_date.timetuple().yday 
    diff = d.timetuple().yday - ref_yday # + optionally code to take care of the difference in hours, minutes,... 
    return abs(diff) <= timedelta 

ここtimedeltaは日です。あなたはTimeDeltaオブジェクトでそれを取得した場合、あなたはpandas直列にあなたの日付を持っている場合、あなたはSeries.dt.dayofyear

df['result'] = (df["MESS_DATUM"].dt.dayofyear - reference_date.timetuple().yday) < timedelta 
+0

'' time.struct_time 'オブジェクトには属性' yday''がありません – Christian

0

以上を使用することによってこれを簡素化することができpd.TimeDelta('1day')

df['result'] = df["MESS_DATUM"].apply(lambda x: diff_without_year(x, ref_date, timedelta)) 

で割ることで変換することができますXの各日付をチェックし、Yの年の日付が10日以内であるかどうか、および前後の日付をチェックするアドホックソリューションです。これは、Xのサイズの線形時間で実行されます。 Xの大きなリストについては、これを適用してpandasデータフレームで行い、このコードを並列化することができます。

import datetime 

timeDelta = 10 # in days 
X = ['2017-10-10', '2014-09-30', '1999-05-10', '1992-10-18'] 
Y = '2019-10-05' 
Y_date = datetime.datetime.strptime(Y, '%Y-%m-%d') # convert to datetime 
td = datetime.timedelta(timeDelta) 
year = Y_date.year 

output_dates = [] 
for date in X: 
    X_date = datetime.datetime.strptime(date, '%Y-%m-%d') 
    month = X_date.month 
    day = X_date.day 

    date_previous_year = datetime.datetime(year=year-1, month=month, day=day) 
    date_current_year = datetime.datetime(year=year, month=month, day=day) 
    date_next_year = datetime.datetime(year=year+1, month=month, day=day) 
    if abs(date_previous_year - Y_date) <= td or \ 
     abs(date_current_year - Y_date) <= td or \ 
     abs(date_next_year - Y_date) <= td: 
     output_dates.append(date) 
print(output_dates) 
+0

これは3年しかチェックしません。私は最後の50〜100年を確認する必要があります。タイムコードの配列と50〜100回のパンを比較する – Christian

+0

コードは、Xの任意の日付を3つの日付に変換し、これらの日付のいずれかがYまで10日以内であるかどうかをチェックします。たとえば、Y = '2019-10-05'とX = '2017-10-10'。 Xは「2019-10-10」(Xと同じ日と月のYの年)、「2018-10-10」(Yの前年)、「2020-10-10」に変換されます。 。これらの日付のいずれかが10日以内に '2019-10-05'になると、それが返されます。この場合、 '2019-10-05'は10日以内に '2019-10-05'になるため、返されます。あなたが望んでいたものではありませんか? –

+0

はい、これは私が望むものですが、私のコードは既にありますが、より短い時間でより大きなセットに対してこれを行うより速い方法があるのだろうかと疑問に思っています – Christian

関連する問題