94426


新しい Pandas で `melt` を使用すると、日付のタイムゾーンが変わりました。  
不具合でしょうか。

[code]

    !pip3 install pandas
    !pip3 list | grep pandas
    
    import pandas as pd
    
    df = pd.DataFrame(data=[
        {'type': 'A0', 'start_date': pd.Timestamp('2023/03/01', tz='Asia/Tokyo'), 'end_date': pd.Timestamp('2023/03/10', tz='Asia/Tokyo')},
        {'type': 'A1', 'start_date': pd.Timestamp('2023/03/01', tz='Asia/Tokyo'), 'end_date': pd.Timestamp('2023/03/11', tz='Asia/Tokyo')},
    ], index=['aaaa', 'bbbb'])
    display(df)
    
    df = df.melt(id_vars=['type'], value_vars=['start_date', 'end_date'], var_name='start/end', value_name='date')
    display(df)
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/rvTaQ.png)](https://i.stack.imgur.com/rvTaQ.png)


CC BY-SA 4.0
2023-04-05T15:49:31.060
94425
2023-04-06T00:42:27.723
2023-04-06T00:42:27.723
3060
35267
question
python python3 pandas
Pandas 2.0 の melt メソッドでタイムゾーンが変わってしまう


問題の箇所は以下です。

[melt() in melt.py](https://github.com/pandas-
dev/pandas/blob/main/pandas/core/reshape/melt.py#L143)

[code]

    if frame.shape[1] > 0:
        mdata[value_name] = concat(
            [frame.iloc[:, i] for i in range(frame.shape[1])]
        ).values
    else:
                        :
    
[/code]

この部分を質問のソースコードに当てはめると以下の様になります。(原因は `values`)

[code]

    from pandas.core.reshape.concat import concat
    
    frame = df[['start_date', 'end_date']]
    print(concat(
              [frame.iloc[:, i] for i in range(frame.shape[1])]
          ).values)
    
    # ['2023-02-28T15:00:00.000000000' '2023-02-28T15:00:00.000000000'
    #  '2023-03-09T15:00:00.000000000' '2023-03-10T15:00:00.000000000']
    
[/code]

ちなみに、`melt()` の実行後に timezone を再設定する方法は以下です。

[code]

    df = df.melt(id_vars=['type'], value_vars=['start_date', 'end_date'], var_name='start/end', value_name='date')
    df['date'] = pd.to_datetime(df['date'], utc=True).dt.tz_convert(tz='Asia/Tokyo')
    print(df)
    
    #   type   start/end                      date
    # 0   A0  start_date 2023-03-01 00:00:00+09:00
    # 1   A1  start_date 2023-03-01 00:00:00+09:00
    # 2   A0    end_date 2023-03-10 00:00:00+09:00
    # 3   A1    end_date 2023-03-11 00:00:00+09:00
    
[/code]


CC BY-SA 4.0
2023-04-05T19:07:54.333
94426
2023-04-05T19:07:54.333
47127
94425
answer