48163


現在、xlsxファイルに日付のデータを保存しています(dates.xlsx)。  
date2-dateを求めたいと考えています。

[code]

    date               date2
    1973年3月     2018年8月
    1984年10月        2018年5月
    1990年1月     2017年12月
    1954年          2016年1月
    
[/code]

これを読み込むために、次のコードを書いています。

[code]

    from datetime import datetime, timedelta
    
    df=pd.read_excel("dates.xlsx") 
    print(df)
    
[/code]

確認すると次のように出力されます。

[code]

    """
    print(df)
                     date  date2
    0  1973-03-01 00:00:00  43313
    1                30956  43221
    2                32874  43070
    3                1954年  42370
    """
    
[/code]

いろいろな形式で入力されてしまいます。

data2からdataを引き算する、"date2-date"を求めるために、次の手順を考えています。

1）形式を揃えるために、年のみで入力されているデータは、"年"を除く。  
2) 日付データの入力形式を揃えて、引き算をする。

現在は、1)については、次のコマンドを行っているのですが、  
年以外のデータはNaNになってしまいます。

[code]

    df['date'] = df['date'].str.replace('年', '')
    
[/code]

どなたか、手順2）まで求める方法を示唆して頂けるとありがたいです。  
よろしくお願いします。


CC BY-SA 4.0
2018-09-06T22:02:09.097
48159
2019-03-09T00:37:07.543
2019-03-09T00:37:07.543
20148
20148
question
python pandas
Excel日付データの入力と計算


簡単に変換関数を書いてみました

[code]

    import pandas as pd
    import numpy as np
    import datetime
    import re
    
    def conv(d):
        if isinstance(d, datetime.datetime):
            # DateTime型のデータはそのまま
            return d
        if isinstance(d, int):
            # Int型のデータは 1900/1/1 からの日数を計算
            return datetime.datetime(1900,1,1) + datetime.timedelta(days=d)
        elif isinstance(d, str):
            # '****年'の形式の文字列をDateTime型に変換
            res = re.match('(\d+)年$', d)
            if res:
                return datetime.datetime(int(res.group(1)),1,1)
        print(d , "：このデータは変換できませんでした")
        return np.nan
    
    df = pd.read_excel("dates.xlsx")
    df = df.applymap(conv)
    
[/code]

実際のデータで動作させてみないと全てのデータが変換できるかわかりませんが、とりあえず

  * Datetime型：そのまま
  * Int型：1900年１月１日からの日数としてDatetime型に変換
  * 文字列："XXXX年" の形式を Datetime型に変換
  * 上記以外 : NaN を返す

という実装となっておりますので、applymap() などを使って全てのデータに適用させてみると良いかと思います。

変換後は

[code]

    print(df.dtypes)
    
[/code]

を行って、"date"と"date2"列がDatetime型となっていることを確認ください


CC BY-SA 4.0
2018-09-07T02:50:07.803
48163
2018-09-07T02:50:07.803
24801
48159
answer