【问题标题】:How to set time zone of values in a Pandas DataFrame?如何在 Pandas DataFrame 中设置值的时区?
【发布时间】:2012-12-22 10:49:03
【问题描述】:

我想在 Pandas DataFrame 中设置列​​值的时区。我正在使用 pandas.read_csv() 读取 DataFrame。

【问题讨论】:

    标签: numpy timezone pandas


    【解决方案1】:

    您可以通过手动设置date_parser 函数直接从read_csv 读取日期为UTC,例如:

    from dateutil.tz import tzutc
    from dateutil.parser import parse
    
    def date_utc(s):
        return parse(s, tzinfos=tzutc)
    
    df = read_csv('my.csv', parse_dates=[0], date_parser=date_utc)
    

    .

    如果要创建时间序列,可以使用 date_rangetz 参数:

    dd = pd.date_range('2012-1-1 1:30', periods=3, freq='min', tz='UTC')
    
    In [2]: dd
    Out[2]: 
    <class 'pandas.tseries.index.DatetimeIndex'>
    [2012-01-01 01:30:00, ..., 2012-01-01 01:32:00]
    Length: 3, Freq: T, Timezone: UTC
    

    .

    如果您的 DataFrame/Series 已经被时间序列索引,您可以使用 tz_localize 方法设置时区:

    df.tz_localize('UTC')
    

    或者如果它已经有一个时区,使用tz_convert:

    df.tz_convert('UTC')
    

    【讨论】:

    • 好点。抱歉,我实际上是在用 pandas.read_csv() 读取 DataFrame。
    • 抱歉,直到您回答我才意识到我的示例具有误导性。
    • 没关系,我希望现在回答你的问题:)
    【解决方案2】:
    # core modules
    from datetime import timezone, datetime
    
    # 3rd party modules
    import pandas as pd
    import pytz
    
    # create a dummy dataframe
    df = pd.DataFrame({'date': [datetime(2018, 12, 30, 20 + i, 56)
                                for i in range(2)]},)
    print(df)
    
    # Convert the time to a timezone-aware datetime object
    df['date'] = df['date'].dt.tz_localize(timezone.utc)
    print(df)
    
    # Convert the time from to another timezone
    # The point in time does not change, only the associated timezone
    my_timezone = pytz.timezone('Europe/Berlin')
    df['date'] = df['date'].dt.tz_convert(my_timezone)
    print(df)
    

    给予

                     date
    0 2018-12-30 20:56:00
    1 2018-12-30 21:56:00
                           date
    0 2018-12-30 20:56:00+00:00
    1 2018-12-30 21:56:00+00:00
                           date
    0 2018-12-30 21:56:00+01:00
    1 2018-12-30 22:56:00+01:00
    

    【讨论】:

      【解决方案3】:

      df['date'] = df['date'].dt.tz_localize('UTC')

      这似乎从我的“天真”时区开始工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-05
        • 2019-05-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多