88445


やりたいこと：  
Pythonでエクセルを読み込み、  
下記の実現結果のエクセルのように申込日の列の日付形式を変換したいです。  
lambda関数を利用して変換したいですがTypeError: strptime() argument 1 must be str, not
floatが発生します。

空文字型の変換の影響で変換できないと思います。  
調べてみましたがなかなか良い方法で日付の形式上手く変換できないです。

このエラーの回避方法分かる方がいましたら、ご教授をお願い致します。  
また別の方法で抽出できるのであれば、教えていただけると幸いです。

**元のエクセルデータ**

申込日 | 内容  
---|---  
2022/3/31 | A-A  
| B-B  
2022/4/1 | C-C  
  
**実現したい結果**

申込日 | 内容  
---|---  
2022-3-31 | A-A  
| B-B  
2022-4-1 | C-C  
  
変換前

[code]

    申込日
    %Y/%m/%d"
    
[/code]

変換後

[code]

    申込日
    %Y-%#m-%#d"
    
[/code]

下記の方法で置換もできますが、全ての列置換されます。  
特定の列置換できる方法もありますか。

[code]

    #置換
    df1 = df.replace(['/'], ['-'])
    
    
[/code]

エラー内容

[code]

     File "c:\Users\test\Documents\test\test.py", line 43, in <lambda>
        df['申込日']=df['申込日'].apply(lambda d: dt.strptime(d, "%Y/%m/%d").strftime("%Y-%#m-%#d"))
    TypeError: strptime() argument 1 must be str, not float
    
[/code]

全体ファイル

[code]

    from datetime import datetime as dt, date, timedelta
    import pandas as pd 
    import os
    import requests
    import json
    
    #今年の日付--------------------------------------------------------
    today= dt.now().strftime("%Y%m%d")
    print(today)
    
    #File名--------------------------------------------------------
    
    filename_test_csv ="\\\\111.111.11\\test\\test.csv"
    
    filename_test_xlsx ="\\\\111.111.11\\test\\test.xlsx"
    #File名--------------------------------------------------------
    
    #CSVファイル処理--------------------------------------------------------
    
    #ファイル更新日付確認--------
    t = os.path.getmtime(filename_test_csv)
    file_date = dt.fromtimestamp(t).strftime('%Y%m%d')
    
    
    print(file_date)
    
    #ダウンロード日付が一致したら次の処理へ進む
    if today==file_date:
        print("ok")
    
        #CSVファイル読み込み
        df = pd.read_csv(filename_test_csv)
    
        #日付の表式変換
        df['申込日']=df['申込日'].apply(lambda d: dt.strptime(d, "%Y/%m/%d").strftime("%Y-%#m-%#d"))
    
        print(df)
    
        #Excel形式出力-------------------
        df.to_excel(filename_test_xlsx,index=False,encoding='utf-8',sheet_name="test")
    
        #CSVファイル処理--------------------------------------------------------
    else:
        # エラー発生時ここにくる
        print("エラー")
    
[/code]


CC BY-SA 4.0
2022-04-22T01:00:10.810
88443
2022-04-22T07:14:21.120
2022-04-22T01:26:02.113
18859
18859
question
python python3 excel
Python エクセル 日付の形式変換方法について


いったんDateTime型に変換してから文字列にすれば良いと思われます。  
その際にエラーは無視することと、無効値を空文字列に指定すれば良いのでは？

こんな形で出来るでしょう。

[code]

    #日付の表式変換
    df['申込日']=pd.to_datetime(df['申込日'],errors='ignore').dt.strftime('%Y-%#m-%#d').fillna('')
    
[/code]

* * *

**コメント対応追記**

特定の列だけ処理したいのであれば、質問でも・あるいは上記回答でも書いてあるように列名を指定すれば良いでしょう。  
この時変換対象文字のパラメータは`[]`には入れない方が良いようです。

[code]

    df['申込日'] = df['申込日'].str.replace('/', '-')
    #### あるいは以下のように
    df.申込日 = df.申込日.str.replace('/', '-')
    
[/code]


CC BY-SA 4.0
2022-04-22T02:45:24.547
88445
2022-04-22T07:14:21.120
2022-04-22T07:14:21.120
26370
26370
88443
answer