質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

278閲覧

Pandasのdatetime型の挙動について。列の値が全て0時00分00秒の場合に0時以降が勝手に省略されてしまう問題。

issRSN

総合スコア6

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

1グッド

0クリップ

投稿2025/03/04 07:12

実現したいこと

Pandasで以下の処理を行っていた際にこの問題に直面しました。

① Pandasで日時情報(YYYY-MM-DD HH:MM:SS)の列を持つDataFrameを作成。
② ①のDataFrameをCSVで保存。
③ Pandasで②のCSVを再読み込み。
④ 日時情報の列をto_datetime(format='%Y-%m-%d %H:%M:%S')でdatetime型に変換。

上記の処理を「2025-11-14 00:00:00、2025-11-14 00:00:00、2025-11-14 00:00:00…」のように0時0分0秒のデータのみで構成されるDataFrameに対して実行すると、
①の処理の時点で、00:00:00の部分を省略した「2025-11-14、2025-11-14、2025-11-14…」というDataFrameを作ってしまうので、④のto_datetime()で想定したformatと異なるためにエラーが返ってきてしまいます。

発生している問題・分からないこと

「該当のソースコード」のdataCやdataDを作成した場合に、"2025-11-XX 00:00:00"という結果を格納してほしいのですが、0時以降が省略されて"2025-11-XX"という結果が格納されてしまいます。
この理由と回避方法が知りたいです。

現状では応急処置として、dataCやdataDのようなDataFrameに対してはto_datetimeのformatを変えるという方法で対処しておりますが、スマートではないですし、根本的な理由が分からずモヤモヤしております。よろしくお願いします。

該当のソースコード

import pandas as pd #1.日時のデータフレームを作成 #--0時0分以外の日時が格納される場合 dataA = pd.DataFrame({"time": pd.to_datetime(["2025-11-14 03:00:00"])}) dataB = pd.DataFrame({"time": pd.to_datetime(["2025-11-14 00:00:00","2025-11-14 03:00:00","2025-11-14 06:00:00"])}) #--0時0分0秒のみが格納される場合 dataC = pd.DataFrame({"time": pd.to_datetime(["2025-11-14 00:00:00"])}) dataD = pd.DataFrame({"time": pd.to_datetime(["2025-11-14 00:00:00","2025-11-15 00:00:00","2025-11-16 00:00:00"])}) #2.CSVで保存 dataA.to_csv(r"saveA.csv",header=True,index=False) dataB.to_csv(r"saveB.csv",header=True,index=False) dataC.to_csv(r"saveC.csv",header=True,index=False) dataD.to_csv(r"saveD.csv",header=True,index=False) #3.再度読み込んでdatetime型に変換してみると… #--エラーなく読み込める ReadA = pd.read_csv(r"saveA.csv") ReadA["time"] = pd.to_datetime(ReadA["time"], format='%Y-%m-%d %H:%M:%S') ReadB = pd.read_csv(r"saveB.csv") ReadB["time"] = pd.to_datetime(ReadB["time"], format='%Y-%m-%d %H:%M:%S') #--to_datetimeでエラー #timeには"2025-11-14 00:00:00"が入っていてほしいのに0時以降が省略された"2025-11-14"が格納されているのでformatが合わずに失敗してしまう→なぜ? ReadC = pd.read_csv(r"saveC.csv") ReadC["time"] = pd.to_datetime(ReadC["time"], format='%Y-%m-%d %H:%M:%S') ReadD = pd.read_csv(r"saveD.csv") ReadD["time"] = pd.to_datetime(ReadD["time"], format='%Y-%m-%d %H:%M:%S')

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

同じことで悩んでおられる方を見つけることができませんでした。(あまりにも初歩的すぎる?)

補足

【バージョン情報】
Python:3.12.2
Pandas:2.2.1

melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2025/03/04 07:29

> この理由と回避方法が知りたいです。 とりあえず回避方法に関してですが、to_csv() で date_format キーワードを指定します。 #2.CSVで保存 dataA.to_csv(r"saveA.csv",header=True,index=False, date_format='%Y-%m-%d %H:%M:%S') dataB.to_csv(r"saveB.csv",header=True,index=False, date_format='%Y-%m-%d %H:%M:%S') dataC.to_csv(r"saveC.csv",header=True,index=False, date_format='%Y-%m-%d %H:%M:%S') dataD.to_csv(r"saveD.csv",header=True,index=False, date_format='%Y-%m-%d %H:%M:%S') pandas.DataFrame.to_csv — pandas 2.2.3 documentation https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html date_format: str, default None   Format string for datetime objects.
issRSN

2025/03/05 06:10

恥ずかしながらto_csv() でdate_formatを指定できるということを存じ上げませんでしたので、 とりあえずdate_formatを指定する方法で対応しようと思います。大変勉強になりました。ありがとうございました。
guest

回答1

0

ベストアンサー

この理由と回避方法が知りたいです。

理由に関してですが、pandas._libs.tslibs.timestamps.Timestamp 型インスタンスの文字列表現を取得する(__repr__() メソッド)処理では以下のメソッドが使用されます。

処理内容としては pd.core.arrays.DatetimeArray._is_dates_onlyTrue の場合には _format_datetime64_dateonly() が、False の場合は _format_datetime64() が呼び出されます。(_is_dates_only の値に関わらず、date_format キーワードが指定されている場合には、そちらが優先されます)

この _is_dates_only は以下の様に説明されています。つまり、時刻(timestamp)が真夜中(午前0時)でタイムゾーンが付加されていない場合は True, それ以外では False になります。

>>> import pandas as pd >>> help(pd.core.arrays.DatetimeArray._is_dates_only) Help on property: Check if we are round times at midnight (and no timezone), which will be given a more compact __repr__ than other cases. For TimedeltaArray we are checking for multiples of 24H.

_format_datetime64_dateonly() の以下の処理で、date_format キーワードが指定されていなければ _date_repr ディスクリプタが返されますので、午前0時の場合は日付のみが表示されることになります。

pd.io.formats.format._format_datetime64_dateonly()

python

1def _format_datetime64_dateonly() 2 : 3 4 if date_format: 5 return x.strftime(date_format) 6 else: 7 # Timestamp._date_repr relies on string formatting (faster than strftime) 8 return x._date_repr

以下では dataCdataA でのタイムスタンプの表示の違いを確認しています。

>>> import pandas as pd ## dataC >>> dataC = pd.DataFrame({"time": pd.to_datetime(["2025-11-14 00:00:00"])}) >>> dataC time 0 2025-11-14 >>> dataC.iloc[0, 0] Timestamp('2025-11-14 00:00:00') >>> type(dataC.iloc[0, 0]) <class 'pandas._libs.tslibs.timestamps.Timestamp'> >>> tc = pd.core.arrays.DatetimeArray(dataC.values) >>> tc <DatetimeArray> [ ['2025-11-14 00:00:00'] ] Shape: (1, 1), dtype: datetime64[ns] >>> tc._is_dates_only np.True_ >>> tc[0, 0]._date_repr '2025-11-14' ## dataA >>> dataA = pd.DataFrame({"time": pd.to_datetime(["2025-11-14 03:00:00"])}) >>> dataA time 0 2025-11-14 03:00:00 >>> dataA.iloc[0, 0] Timestamp('2025-11-14 03:00:00') >>> type(dataA.iloc[0, 0]) <class 'pandas._libs.tslibs.timestamps.Timestamp'> >>> ta = pd.core.arrays.DatetimeArray(dataA.values) >>> ta <DatetimeArray> [ ['2025-11-14 03:00:00'] ] Shape: (1, 1), dtype: datetime64[ns] >>> ta._is_dates_only np.False_ >>> str(ta[0, 0]) '2025-11-14 03:00:00'

回避方法としては、質問にコメントした様に to_csv() メソッドで date_format キーワードを指定するとよいかと思います。

投稿2025/03/04 09:16

編集2025/03/04 09:55
melian

総合スコア21049

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2025/03/04 09:48

おそらく回答者さんは分かったうえで書かれているんだと思いますが、pythonでは、_ で始まる属性は勝手に外から変更しないのがお約束です。 ソースコードを完全に理解したうえでやる、ほかに影響がないか確認している、それ以外に方法がない、といった場合以外は簡単にやるべきではないと思います。
melian

2025/03/04 09:52

> bsdfanさん 了解です、その様に変更します。
issRSN

2025/03/05 06:09

Pandasの仕様(設定次第)ということで納得できました。 そして、恥ずかしながらto_csv() でdate_formatを指定できるということを存じ上げませんでしたので、 とりあえずdate_formatを指定する方法で対応しようと思います。大変勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問