76085


CSVファイルのデータを抽出した日付のデータを変換したいです。  
下記のようにエクセルのデータには日付＋時間になっていますので、上手くいかないです。  
`format="%Y-%m-%d"` 日付の形式を変換するにはどのようにすればよろしいでしょうか。

わかる方いらっしゃいましたらご教示願います。  
お手数ですが、宜しくお願いいたします。

**CSVのデータ:**

[code]

    A         
    21-05-25 14:47:47
    
[/code]

**フォーマットの変換後 (期待する結果):**

[code]

    A         
    21-05-25
    
[/code]

**エラー:**

[code]

     result, tz_parsed = tslib.array_to_datetime(
     File "pandas\_libs\tslib.pyx", line 352, in pandas._libs.tslib.array_to_datetime
      File "pandas\_libs\tslib.pyx", line 496, in pandas._libs.tslib.array_to_datetime
    ValueError: time data 21-05-25 14:47:27 doesn't match format specified
    
[/code]

**コード:**

[code]

    import pandas as pd
    
    with codecs.open(filename, "r", "Shift-JIS", "ignore") as file:
        df1 = pd.read_table(file, delimiter=",")
    　　 df2=pd.to_datetime(df1['A'], format="%Y-%m-%d")
        print(df2)
    
[/code]


CC BY-SA 4.0
2021-05-26T08:36:04.200
76080
2021-05-26T11:14:37.033
2021-05-26T11:03:22.560
3060
18859
question
python csv
Excelの日付フォーマットを変換


元のデータが時分秒まであるので、`format`にはそれをきちんと指定する必要があるでしょう。

そして年が2桁の場合は小文字の`%y`を指定する必要があります。

[pandasで様々な日付フォーマットを取り扱う](https://qiita.com/TomokIshii/items/ff14771ac0e77632969a)  
[Pandasのデータを格納するオブジェクトDataFrameを理解する](https://deepage.net/features/pandas-
dataframe.html)

だから`format`は`"%y-%m-%d %H:%M:%S"`になるでしょう。

* * *

変換後の形式も年を2桁にするためにはフォーマットを指定する必要があるでしょう。

[pandasで日付・時間の列を処理（文字列変換、年月日抽出など）](https://note.nkmk.me/python-pandas-
datetime-timestamp/)

> pandas.Series全体に日時処理を適用するdtアクセサがある。

[Datetimelike properties](https://pandas.pydata.org/pandas-
docs/stable/reference/series.html#api-series-dt)

その中でこれを使えば良いでしょう。  
[pandas.Series.dt.strftime](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.dt.strftime.html)

こんな感じでしょうか。`dt.strftime('%y-%m-%d')`

* * *

あと、上記を併せるとDataFrameではなくなるようなので、この行を：  
`df2=pd.to_datetime(df1['A'], format="%Y-%m-%d")`

こちらのようにさらにDataFrame作成で囲んで変更すれば出来るのでは？

[code]

    df2 = pd.DataFrame(pd.to_datetime(df1['A'], format="%y-%m-%d %H:%M:%S").dt.strftime('%y-%m-%d'))
    
[/code]

もしくは`from datetime import datetime`して以下のようにするとか：  
[DataFrame 列を Datetime に変換する DataFrame apply
メソッド](https://www.delftstack.com/ja/howto/python-pandas/how-to-convert-
dataframe-column-to-datetime-in-
pandas/#dataframe-%E5%88%97%E3%82%92-datetime-%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B-dataframe-
apply-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)

[code]

    from datetime import datetime
    df2 = pd.DataFrame()
    df2['A'] = df1['A'].apply(lambda _: datetime.strptime(_,"%y-%m-%d %H:%M:%S").strftime('%y-%m-%d'))
    
[/code]

* * *

他の考え方として日付時刻ではなく、単なる空白をはさんだ文字列だと考えれば、`str.partition`で分けて最初の物だけ使う方法も考えられます。  
ただしこちらは列名が無くなって列番号になるようなので、後で名前変換の必要があるようです。

[str.partition(sep)](https://docs.python.org/ja/3/library/stdtypes.html#str.partition)  
[Pythonで特定の文字以降を削除する](https://www.relief.jp/docs/python-get-string-before-
specific-character.html)  
ちなみに`str.split`だと上手くいきませんでした。

こんな感じになるでしょう。

[code]

    df2 = pd.DataFrame(df1['A'].str.partition(' ')[0])
    df2 = df2.rename(columns={0:'A'})
    
[/code]

こちらも`apply`と`lambda`で処理する方法ではこんな感じでしょう。

[code]

    df2 = pd.DataFrame()
    df2['A'] = df1['A'].apply(lambda _: _.partition(' ')[0])
    
[/code]

ただしこちらは`split()`でも出来るようです。

[code]

    df2 = pd.DataFrame()
    df2['A'] = df1['A'].apply(lambda _: _.split(' ')[0])
    
[/code]


CC BY-SA 4.0
2021-05-26T09:10:16.457
76083
2021-05-26T10:36:35.667
2021-05-26T10:36:35.667
26370
26370
76080
answer


以下は `pandas.read_table()` の `date_parser` を使う方法です。

[code]

    import pandas as pd
    import codecs
    from datetime import datetime as dt
    
    with codecs.open(filename, "r", "Shift-JIS", "ignore") as file:
      df2 = pd.read_table(
        file, delimiter=",", parse_dates=['A'],
        date_parser=lambda d: dt.strptime(d, '%y-%m-%d %H:%M:%S').date()
      )
      print(df2)
    
[/code]


CC BY-SA 4.0
2021-05-26T11:14:37.033
76085
2021-05-26T11:14:37.033
76080
answer