検索

ホームページ  >  に質問  >  本文

datetime - 关于一个日期时间间隔计算相关的算法(Python)

求一个关于日期时间间隔计算相关的算法,具体问题如下:
当前有一个比较大(上万个)日期时间的list(时间递增但无规律),假设 dt=[
'2015-01-02 10:21:02',
'2015-01-02 10:21:02'
'2015-01-02 10:21:03'
'2015-01-02 10:21:04'
'2015-01-02 10:21:06'
'2015-01-02 10:21:10'
'2015-01-02 10:21:11'
'2015-01-02 10:21:13'
'2015-01-02 10:22:00'
'2015-01-02 10:22:12'
... ...
]
给定一个时间间隔timeframe(假设4s),现在问题是:求在给定连续时间间隔内,list中最多项数目。

最简单的方法是依次对于list中每个项x,向后查找直至大于timeframe+x的项并统计个数。但由于这个list数量庞大,同时还要涉及时间运算,算法难以达到要求,特来请教!

大家讲道理大家讲道理2804日前896

全員に返信(3)返信します

  • 大家讲道理

    大家讲道理2017-04-18 09:23:33

    まず私の答えを教えてください:

    リーリー

    上記のコードの datetimetimedelta を忘れずにインポートしてください。

    これは O(n) アプローチです。n は timestrs の数です。

    コードは少し醜いので、後で修正しますが、速度と正確性を比較するために、いくつかの実験を行いました。実験に使用した完全なコードは次のとおりです。

    リーリー

    が含まれます

    • タイミングのための非常にクールなデコレーター: simpletimer

      • 彼は func を装飾し、

      の実行にかかった時間を出力します。
    • ランダムなテスト結果を生成する関数: gentimestrs

      • count 時間文字列テスト データを生成します。各データの時間間隔は、delta

      以下のランダムな整数です。
    • 以下の findmaxfindmax2 は、それぞれ私のアプローチと @citaret のアプローチです (興味があれば、インターフェイスを真似して独自の機能を追加することもできますし、質問者が独自のアプローチを使用することもできます)比較してみましょう)、simpletimer を使用して時間を計測します。

    • テストする場合は、まずテストアセットを生成し、次に funclst

    • で比較する関数を実行します。

    実行例は以下のとおりです。

    リーリー

    結果の一部を次に示します:

    timeframe==5 を使用して資金 1000、10000、100000 をテストします

    リーリー

    timeframe==10 を使用して資金 1000、10000、100000 をテストします

    リーリー
    1. タイムフレームのサイズが変更されずに維持される場合、両方の時間で測定されたファンドの数が直線的に増加します

    2. しかし、時間枠が 2 倍になると、2 番目の方法には 2 倍の時間がかかります

    これは、@citaret の最大メソッド複雑度が O(n * timeframe)

    であることを意味します。

    もう 1 つの点は、これら 2 つの方法の結果が同じではない場合があるということです。質問者が方法を持っていれば、その正しさを検証できます。

    私が見つけた答えは正しいようですが、間違っている場合は修正してください。ありがとうございます。

    より多くの人がこの問題について話し合うことを歓迎します。


    私が回答した質問: Python-QA

    返事
    0
  • 高洛峰

    高洛峰2017-04-18 09:23:33

    データがなく、適切なプロファイルもありません。他の人がより良い解決策を持っているかどうかを確認するために、まずバージョンを提供してみましょう。

    リーリー

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:23:33

    @dokelung は、合計 27505 個の要素を含むリスト (630,000 行の単一ログ ファイルから抽出され、複数のソース IP から集約) を使用してテストしました。私の当初の時間は 16.544873371035163 秒でした。効率は大幅に向上しましたが、それでも数秒ですが、これは 1 日あたり 1 つのファイルにすぎません。同時に、より深刻な効率の問題は、実際には関数内の要件を満たすログ行の抽出であることがわかりました。ご回答とご参加ありがとうございました。

    返事
    0
  • キャンセル返事