【问题标题】:convert timestamptz to timestamp将时间戳转换为时间戳
【发布时间】:2021-04-02 14:49:49
【问题描述】:

我的数据框 df 是 postgres 表的结果。如果行符合以下条件,我想应用 lambda 函数,以便在 date_ 为 timestamptz 并使用时间戳强制转换时删除区域。

table1:
date_ = up_1
2013-09-27 14:19:46.825000+02:00
2017-03-28 10:10:10.305000+01:00
2019-05-10 10:10:10
table2:
date_ = up_2
2013-09-27 14:19:46.825000+02:00
None
2019-05-10 09:10:00
**expected output**
table 1: 
  2013-09-27 14:19:46
  2017-03-28 10:10:10
  2019-05-10 10:10:10
table 2: 
  2013-09-27 14:19:46
  None
  2019-05-10 09:10:00

我收到错误 E TypeError: 'tzinfo' is an invalid keyword argument for this function。谢谢你。 请问我该如何更正下面的代码? 我的提议:

if self.date_ in df.columns and df[str(self.date_)].dtypes== 'object' \
and df[str(self.date_)][df[str(self.date_)] != "None"]:
     df[str(self.date_)] = df[str(self.date_)].apply(lambda x: x if pd.isnull(x) else 
     x.replace(tzinfo=None))

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果需要将值转换为 UTC,请在 to_datetime 中添加 utc=True

    df['date1'] = pd.to_datetime(df['date'], utc=True)
    

    如果需要删除 + 之后的值,请使用 Series.str.splitstr[0]

    df['date2'] = pd.to_datetime(df['date'].str.split('+').str[0])
    print (df)
                                   date                            date1  \
    0  2013-09-27 14:19:46.825000+02:00 2013-09-27 12:19:46.825000+00:00   
    1  2017-03-28 10:10:10.305000+01:00 2017-03-28 09:10:10.305000+00:00   
    2               2019-05-10 10:10:10        2019-05-10 10:10:10+00:00   
    
                        date2  
    0 2013-09-27 14:19:46.825  
    1 2017-03-28 10:10:10.305  
    2 2019-05-10 10:10:10.000 
    
    print (df.dtypes)
    date                  object
    date1    datetime64[ns, UTC]
    date2         datetime64[ns]
    dtype: object
    

    编辑:

    如果需要删除.之后的值:

    df['date'] = df['date'].astype(str).str.split('.').str[0]
    #with convert to datetimes
    #df['date'] = pd.to_datetime(df['date'].astype(str).str.split('.').str[0])
    print (df)
    
                      date
    0  2013-09-27 14:19:46
    1  2017-03-28 10:10:10
    2  2019-05-10 10:10:10
    

    编辑1:

    在您的解决方案更改中:

     else x.replace(tzinfo=None)
    

    到:

     else str(x).split('.')[0]
    

    【讨论】:

    • 感谢您的回复。不幸的是,我无法创建新列,因为我正在处理大数据。这不是我真正的预期输出。我将更新我的原始帖子以解释更多。谢谢
    • @biwia - 所以需要EDIT 的解决方案?
    • 是的,如果您能提供帮助,我只是添加了预期的输出。谢谢
    • @biwia - 我认为是的,添加了 EDITEDIT1 以获得新的解决方案。
    • 谢谢,但现在出现此错误 E TypeError: can't compare offset-naive and offset-aware datetimes
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 2013-04-07
    • 2011-01-15
    • 2019-08-15
    • 2020-10-19
    • 2020-11-22
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多