日時変換 - 推定された形式を抽出するにはどうすればいいですか? 質問する

日時変換 - 推定された形式を抽出するにはどうすればいいですか? 質問する

日時値の配列は次のとおりです。

array = np.array(['2016-05-01T00:00:59.3+10:00', '2016-05-01T00:02:59.4+10:00',
                  '2016-05-01T00:03:59.4+10:00', '2016-05-01T00:13:00.1+10:00',
                  '2016-05-01T00:22:00.5+10:00', '2016-05-01T00:31:01.1+10:00'],
        dtype=object)

pd.to_datetime日付時刻形式の推測に非常に優れています。

array = pd.to_datetime(array)

print(array)
DatetimeIndex(['2016-04-30 14:00:59.300000', '2016-04-30 14:02:59.400000',
               '2016-04-30 14:03:59.400000', '2016-04-30 14:13:00.100000',
               '2016-04-30 14:22:00.500000', '2016-04-30 14:31:01.100000'],
              dtype='datetime64[ns]', freq=None)

どのようにすれば、推測された日時形式を動的に把握できるでしょうかpd.to_datetime? 次のようなものです: %Y-%m-%dT...(申し訳ありませんが、私のdatetime fooはすごく悪い)。

ベストアンサー1

パンダでこれを完全に一般化することは不可能だと思います。

他のコメントや回答で述べたように、内部関数_guess_datetime_format要求されているものに近いですが、推測可能な形式を構成するものに関して厳格な基準があるため、日時文字列の制限されたクラスでのみ機能します。

これらの基準は_guess_datetime_formatこれらの行また、良いフォーマットと悪いフォーマットの例もいくつか見ることができます。テスト解析脚本。

主なポイントは次のとおりです。

  • 年、月、日はそれぞれ存在し、識別可能でなければならない
  • 年は4桁でなければなりません
  • マイクロ秒を使用する場合は、正確に6桁を使用する必要があります。
  • タイムゾーンを指定することはできません

これは、質問内の日付時刻文字列が有効な形式であるにもかかわらず、その形式を推測できないことを意味します。8601 規格フォーマット:

>>> from pandas.core.tools.datetimes import _guess_datetime_format_for_array
>>> array = np.array(['2016-05-01T00:00:59.3+10:00'])
>>> _guess_datetime_format_for_array(array)
# returns None

この場合、タイムゾーンを削除し、マイクロ秒を 6 桁にパディングするだけで、pandas に形式を認識させることができます。

>>> array = np.array(['2016-05-01T00:00:59.300000']) # six digits, no tz
>>> _guess_datetime_format_for_array(array)
'%Y-%m-%dT%H:%M:%S.%f'

おそらくこれが最高でしょう。

pd.to_datetime配列の形式を推測するように求められない場合、または試行する形式文字列が指定されていない場合は、各文字列を個別に解析して、成功することを期待します。重要なのは、これを行うために事前に形式を推測する必要がないことです。

まず、パンダは文字列が() ISO 8601形式。これは、_string_to_dtsそして最終的には低レベルに到達しますparse_iso_8601_datetime大変な作業を実行する機能。

文字列がこのように解析できるかどうかを確認するには、_test_parse_iso8601関数。例:

from pandas._libs.tslib import _test_parse_iso8601

def is_iso8601(string):
    try:
        _test_parse_iso8601(string)
        return True
    except ValueError:
        return False

指定した配列内の日付は次の形式で認識されます。

>>> is_iso8601('2016-05-01T00:00:59.3+10:00')
True

しかし、これでは質問が求めているものが実現されず、関数によって認識される正確な形式を回復する現実的な方法は見当たりませんparse_iso_8601_datetime

文字列をISO 8601形式で解析できない場合、pandasはparse()サードパーティのdateutilライブラリの関数(parse_datetime_string)。これにより、解析の柔軟性が非常に高まりますが、繰り返しになりますが、この関数から認識された日時形式を抽出する良い方法はわかりません。

もし両方これら 2 つのパーサーのいずれかが失敗すると、pandas はエラーを発生させるか、文字列を無視するか、またはデフォルトNaT(ユーザーの指定に応じて) に設定します。文字列を解析したり、文字列の形式を推測したりする試みはそれ以上行われません。

おすすめ記事