将时区从时间戳列转换为各种时区

Posted

技术标签:

【中文标题】将时区从时间戳列转换为各种时区【英文标题】:Convert Timezone from Timestamp column to various timezones 【发布时间】:2021-11-11 17:17:30 【问题描述】:

我有如下数据集:

start_time_UTC
2021-09-16T12:00:00-05:00
2021-09-15T19:00:00-05:00
2021-09-16T08:18:00-05:00
2021-09-16T12:22:10-05:00

我的默认时间是 UTC,但我想根据 start_time_UTC 创建多个列来创建 cst、mst 和 est。

    from datetime import datetime as dt
    import pandas as pd
    from pytz import timezone
    import pytz
    
    df = read_dataframe('my_dataset')
    
    df['time_stamp'] = df['start_time']
    utc = timezone('UTC')
    cst = timezone('US/Central')
    mst = timezone('US/Mountain')
    est = timezone('US/Eastern')

    # my issue begins at 'published_time"
    published_time = time_stamp.apply(lambda x: dt.strptime(df.time_stamp, '%a, %d %b %Y %H:%M:%S %Z'))
    time_utc = published_time.replace(tzinfo=utc)
    time_cst = published_time.replace(tzinfo=cst)
    time_mst = published_time.replace(tzinfo=mst)
    time_est = published_time.replace(tzinfo=est)
       
    # then call using time_timezone
    df['time_published_cst'] = time_cst.strftime('%I:%M:%S %p %Z')
    df['time_published_est'] = time_est.strftime('%I:%M:%S %p %Z')
    df['time_published_mst'] = time_mst.strftime('%I:%M:%S %p %Z')
    df['time_published_utc'] = time_utc.strftime('%I:%M:%S %p %Z')

最初我收到以下错误消息:“TypeError: strptime() argument 1 must be str, not Series”:

published_time = datetime.strptime(time_stamp, '%a, %d %b %Y %H:%M:%S %Z')

所以我使用 lambda 对其进行了更改:

published_time = time_stamp.apply(lambda x: dt.strptime(df.time_stamp, '%a, %d %b %Y %H:%M:%S %Z'))

我收到一条错误消息,“NameError: name 'time_stamp' is not defined”

如果您发现我在此脚本中可能做错了什么,我将不胜感激。

【问题讨论】:

好吧,您的代码中没有 time_stamp 变量。你的意思是:df['time_stamp'] 是的,但是当我将其更改为 published_time = df['time_stamp'].apply(lambda x: dt.strptime('time_stamp', '%a, %d %b %Y %H :%M:%S %Z')) 它说,'time_stamp' 与格式 '%a, %d %b %Y %H:%M:%S %Z' 不匹配 见ISO8601:像2021-09-16T12:00:00-05:00这样的字符串表示UTC时间减去五个小时,所以在这种情况下UTC将是2021-09-16T17:00:00Z 【参考方案1】:

您提供的数据中的start_time_UTC 列似乎是UTC-05:00。下面的解决方案将其视为 UTC 以避免额外的步骤。我只包含了一个指定的时区以使其更短,因为我不完全确定我了解您要完成的工作。

您不需要datetimepytz。所有功能均由pandas 提供。

# Convert column to datetime UTC
df['start_time_UTC'] = pd.to_datetime(df['start_time_UTC'], utc=True)

#             start_time_UTC
#0 2021-09-16 17:00:00+00:00
#1 2021-09-16 00:00:00+00:00
#2 2021-09-16 13:18:00+00:00
#3 2021-09-16 17:22:10+00:00

# Create new column with converted timezone (still datetime)
df['start_time_est'] = df['start_time_UTC'].dt.tz_convert('US/Eastern')

#             start_time_UTC            start_time_est
#0 2021-09-16 17:00:00+00:00 2021-09-16 13:00:00-04:00
#1 2021-09-16 00:00:00+00:00 2021-09-15 20:00:00-04:00
#2 2021-09-16 13:18:00+00:00 2021-09-16 09:18:00-04:00
#3 2021-09-16 17:22:10+00:00 2021-09-16 13:22:10-04:00

# Create new column with timezone aware time_published per the specified format string
df['time_published_est'] = df['start_time_est'].dt.strftime('%I:%M:%S %p %Z')

#             start_time_UTC            start_time_est time_published_est
#0 2021-09-16 17:00:00+00:00 2021-09-16 13:00:00-04:00    01:00:00 PM EDT
#1 2021-09-16 00:00:00+00:00 2021-09-15 20:00:00-04:00    08:00:00 PM EDT
#2 2021-09-16 13:18:00+00:00 2021-09-16 09:18:00-04:00    09:18:00 AM EDT
#3 2021-09-16 17:22:10+00:00 2021-09-16 13:22:10-04:00    01:22:10 PM EDT

【讨论】:

这似乎无法正常工作。默认时间已经是 UTC,但转换后它会将 2021-09-15 18:58:25 更改为 11:58 PM UTC,这是不正确的,因为时间应该是 6:58 PM UTC 其余代码是否按预期工作?正如 MrFuppes 在对原始问题的评论中指出的那样,所提供的数据不是 UTC。

以上是关于将时区从时间戳列转换为各种时区的主要内容,如果未能解决你的问题,请参考以下文章

如何从熊猫数据框中的时间戳列中删除时区

将UTC时间戳转换为熊猫中的本地时区问题

将时间戳转换为特定时区然后在 bigquery 中将其转换为日期时出现问题

使用带时区的时间戳提取日期

Python:如何将日期时间/时间戳从一个时区转换为另一个时区?

Python pytz 将时间戳(字符串格式)从一个时区转换为另一个时区