2017-10-25 13 views
0

開始日と終了日を入力した後に日付範囲を生成するスクリプトを作成しようとしています。例えばのでパンダの日付範囲

開始= 2016年1月1日

終了= 2017年10月1日

スクリプトが出力されます。このようなリストは:

['2016-01-01 2016-04-01'、

2016年4月1日2016年7月1' 日、

'2016年7月1日2016年10月1日'、

'2016年10月1日2017年1月1日'、

'2017年1月1日2017年4月1日'、

'2017年4月1日2017年7月1日'、

'2017年7月1日2017年10月1日']

これまでのところ、私は遺伝子すべての必要な時間範囲を評価していますが、個々の日付をこれらの時間範囲に必要な時間形式にグループ化するのに問題があります。ここで

は私のコードは、これまでのところ、この出力

start = '2016-01-01' 
end = str(pd.to_datetime('today').replace(day=1))[:10] 
dates = list(pd.date_range(start, end, freq="3MS")) 
new_dates = [] 
for i in dates: 
    i= str(i)[:10] 
    new_dates.append(i) 

です:誰かがスクリプトの最後の部分で私を助けている場合 `

['2016-01-01', 
'2016-04-01', 
'2016-07-01', 
'2016-10-01', 
'2017-01-01', 
'2017-04-01', 
'2017-07-01', 
'2017-10-01'] 

私は非常に感謝しています。 dates配列で

答えて

1

あなたが最初の(@Psidomの答えは1として)それぞれ最初と最後の要素を取り除いた後のタプルのリストに二つの別々のリストをマージすることができます:

dates1 = dates[:-1] 
dates2 = dates[1:] 

これはdates1が欠落している二つのリストを生成します元のリストの最後の要素で、dates2に元のリストの最初の要素がありません。

dates3 = zip(dates1, dates2) 

これは、このようなdates3構造を生成します:

[('2016-01-01', '2016-04-01'), ('2016-04-01', '2016-07-01'), ...] 

今、あなたはこのようなあなたの所望の出力文字列のリストを生成することがありました:

output = [x + ' ' + y for x,y in dates3] 

あなたはまた、すべて書くことができますこれは一行で行いますが、可読性を損なう可能性があります。

output = [x + ' ' + y for x,y in zip(dates[:-1], dates[1:])] 
1

、二つの配列、dates[:-1]と最後の要素を取り除くdates[1:]との最初の要素を削除してからcolumn_stack:範囲ごとにエントリを取得するには

import numpy as np 

start = '2016-01-01' 
end = pd.to_datetime('today').replace(day=1) 
dates = pd.date_range(start, end, freq="3MS").strftime('%Y-%m-%d') 

np.column_stack((dates[:-1], dates[1:])) 
#array([['2016-01-01', '2016-04-01'], 
#  ['2016-04-01', '2016-07-01'], 
#  ['2016-07-01', '2016-10-01'], 
#  ['2016-10-01', '2017-01-01'], 
#  ['2017-01-01', '2017-04-01'], 
#  ['2017-04-01', '2017-07-01'], 
#  ['2017-07-01', '2017-10-01']], 
#  dtype='<U10') 

を、私たちはそれらを追加することができますアップ:

np.char.add(np.char.add(dates[:-1], ' '), dates[1:]) 
#array(['2016-01-01 2016-04-01', '2016-04-01 2016-07-01', 
#  '2016-07-01 2016-10-01', '2016-10-01 2017-01-01', 
#  '2017-01-01 2017-04-01', '2017-04-01 2017-07-01', 
#  '2017-07-01 2017-10-01'], 
#  dtype='<U21') 
+0

ここでは、2つの日付オブジェクトを持つ配列がありますが、質問は範囲ごとに1つの文字列を参照します。 –

+0

@IgnacioVergaraKauselそうです。問題を修正しました。 – Psidom

+0

この変更がどのようにパフォーマンスに大きな影響を与えるか興味深い。 –

1

numpyの無料の代替を追加

import pandas as pd 

start = '2016-01-01' 
end = pd.to_datetime('today').replace(day=1) 
dates = pd.date_range(start, end, freq="3MS").strftime('%Y-%m-%d') 

coupled_dates = [] 

for date in zip(*(dates[:-1], dates[1:])): 
    coupled_dates.append(' '.join(date)) 

coupled_dates 

ここでの注意点は、@ Psidomが提供する最初のnumpyソリューションの約2倍の速度を実行することです。 "プロッパー"の第2版を取るとき、numpyはpythonより3倍悪いです。

pandas/numpyにアクセスできない場合に備えて、標準のdatetimeモジュールでこのソリューションを使用する可能性が高いという利点があります。

1
import pandas as pd 
a = pd.date_range("20160101","20171001", freq="3MS") # given date range 
b =a.map(str).map(lambda x: x[:10]) # to_string and take 10 characters 
c = b[:-1]+" "+b[1:] # shift the index array and join strings 
d = c.tolist() # cast to python's list if you need