繁体   English   中英

Python - 使用多个时区解析 object 索引

[英]Python - Parse object index with multiple time zones

Python Q. 当数据帧有多个时区时,如何将数据帧中的 object 索引解析为其日期、时间和时区?

格式为“YYY-MM-DD HH:MM:SS-HH:MM”,其中右侧的“HH:MM”是时区。

示例:山区时间 2020 年 1 月 1 日午夜,向上计数:

2020-01-01 00:00:00-07:00
2020-01-01 01:00:00-07:00
2020-01-01 02:00:00-07:00
2020-01-01 04:00:00-06:00

我有适用于一个时区的代码,但在引入第二个时区时它会中断。

df['Date'] = pd.to_datetime(df.index)
df['year']= df['Date'].dt.year
df['month']= df['Date'].dt.month
df['month_n']= df['Date'].dt.month_name()
df['day']= df['Date'].dt.day
df['day_n']= df['Date'].dt.day_name()
df['h']= df['Date'].dt.hour
df['mn']= df['Date'].dt.minute
df['s']= df['Date'].dt.second

ValueError:Tz 感知 datetime.datetime 不能转换为 datetime64,除非 utc="True"

使用pandas.DataFrame.apply代替:

df['Date'] = pd.to_datetime(df.index)

df_info = df['Date'].apply(lambda t: pd.Series({
    'date': t.date(),
    'year': t.year,
    'month': t.month,
    'month_n': t.strftime("%B"),
    'day': t.day,
    'day_n': t.strftime("%A"),
    'h': t.hour,
    'mn': t.minute,
    's': t.second,
}))

df = pd.concat([df, df_info], axis=1)
# Output:
print(df)

                                                    Date        date  year  month  month_n  day      day_n  h  mn  s
    col                                                                                                             
    2020-01-01 00:00:00-07:00  2020-01-01 00:00:00-07:00  2020-01-01  2020      1  January    1  Wednesday  0   0  0
    2020-01-01 01:00:00-07:00  2020-01-01 01:00:00-07:00  2020-01-01  2020      1  January    1  Wednesday  1   0  0
    2020-01-01 02:00:00-07:00  2020-01-01 02:00:00-07:00  2020-01-01  2020      1  January    1  Wednesday  2   0  0
    2020-01-01 04:00:00-06:00  2020-01-01 04:00:00-06:00  2020-01-01  2020      1  January    1  Wednesday  4   0  0

如果您不确定实际时区或无法使用 UTC,@abokey 的答案非常棒。 但是,您没有dt访问器并失去了“矢量化”方法的性能。

因此,如果您可以使用 UTC 或设置时区(此时您只有 UTC 偏移量)。 例如,“美国/丹佛”:一切都将按预期工作:

import pandas as pd

df = pd.DataFrame({'v': [999,999,999,999]},
                   index = ["2020-01-01 00:00:00-07:00",
                            "2020-01-01 01:00:00-07:00",
                            "2020-01-01 02:00:00-07:00",
                            "2020-01-01 04:00:00-06:00"])

df['Date'] = pd.to_datetime(df.index, utc=True)

print(df.Date.dt.hour)
# 2020-01-01 00:00:00-07:00     7
# 2020-01-01 01:00:00-07:00     8
# 2020-01-01 02:00:00-07:00     9
# 2020-01-01 04:00:00-06:00    10
# Name: Date, dtype: int64

# Note: hour changed since we converted to UTC !

或者

df['Date'] = pd.to_datetime(df.index, utc=True).tz_convert("America/Denver")
print(df.Date.dt.hour)
# 2020-01-01 00:00:00-07:00    0
# 2020-01-01 01:00:00-07:00    1
# 2020-01-01 02:00:00-07:00    2
# 2020-01-01 04:00:00-06:00    3
# Name: Date, dtype: int64

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM