【问题标题】:Remove "plus" sing from date从日期中删除“加号”
【发布时间】:2023-03-03 15:38:01
【问题描述】:

如何将带时区的时间戳转换为正常的“日期时间”类型? 当我打印我的 df 的 df.dtypes 时,我得到“对象”作为该列的类型而不是“日期时间”

我有数据框:

| Resource | timestamp                       |
| -------- | --------------                  |
| 112      | 2011-10-01 00:38:44.546000+02:00|
| 113      | 2011-10-02 00:38:44.546000+02:00|
| 112      | 2011-10-03 00:38:44.546000+02:00|
| 115      | 2011-10-04 00:38:44.546000+02:00|
| 114      | 2011-10-05 00:38:44.546000+02:00|

我用过

df_log['time:timestamp'] = df_log['time:timestamp'].apply(lambda x: dt.strftime(dt.fromisoformat(str(x)),'%Y-%m-%d.%H:%M:%S'))

它删除了“+”号并给了我日期和时间部分,但我觉得我做错了,因为我对日期时间处理没有很好的了解! 我的目标是获得像“2011-10-01 00:38:44”这样的日期和时间,并且类型是“datetime”而不是我仍然得到的对象!

【问题讨论】:

  • 我没有得到对象。我在做df['timestamp'] = pd.to_datetime(df['timestamp']) 后得到datetime64[ns, pytz.FixedOffset(120)] 的dtype
  • pd.to_datetime(df['timestamp'].astype(str).str[:19])怎么样
  • @Ferris 谢谢,你的代码比我的更短更干净,尽管两者给出了相同的结果。我的问题是,如果我知道这是我正在尝试学习和理解的日期时间转换过程,我是否做错了:(
  • @DavidErickson 我的表已从日志文件 (xes) 转换为 pandas df - 如果它最初是 df 那么你是对的,它会产生日期时间类型

标签: python pandas datetime


【解决方案1】:

你可以使用:

df['timestamp'] = pd.to_datetime(df['timestamp'].str.replace('\+.*', ''))
df.info()

     #   Column     Non-Null Count  Dtype         
---  ------     --------------  -----         
 0   Resource   5 non-null      object        
 1   timestamp  5 non-null      datetime64[ns]

df['timestamp'] = pd.to_datetime(df['timestamp'])
df.info()

如果不替换,则返回 datetime64[ns, pytz.FixedOffset(120)] 日期类型:

df['timestamp'] = pd.to_datetime(df['timestamp'])
df.info()

     #   Column     Non-Null Count  Dtype                                
---  ------     --------------  -----                                
 0   Resource   5 non-null      object                               
 1   timestamp  5 non-null      datetime64[ns, pytz.FixedOffset(120)]

你也可以使用:

df['timestamp'] = pd.to_datetime(df['timestamp']).dt.tz_convert(None)

来自这个答案:https://stackoverflow.com/a/59919896/6366770

根据 docs,在 2019 年 1 月 25 日发布的 0.24.0 中,pandas 处理 datetime 偏移的方式发生了变化:


*Previous behavior:
In [2]: pd.to_datetime("2015-11-18 15:30:00+05:30")
Out[2]: Timestamp('2015-11-18 10:00:00')
In [3]: pd.Timestamp("2015-11-18 15:30:00+05:30")
Out[3]: Timestamp('2015-11-18 15:30:00+0530', tz='pytz.FixedOffset(330)')
# Different UTC offsets would automatically convert the datetimes to UTC (without a UTC timezone)
In [4]: pd.to_datetime(["2015-11-18 15:30:00+05:30", "2015-11-18 16:30:00+06:30"])
Out[4]: DatetimeIndex(['2015-11-18 10:00:00', '2015-11-18 10:00:00'], dtype='datetime64[ns]', freq=None)
New behavior:
In [56]: pd.to_datetime("2015-11-18 15:30:00+05:30")
Out[56]: Timestamp('2015-11-18 15:30:00+0530', tz='pytz.FixedOffset(330)')
In [57]: pd.Timestamp("2015-11-18 15:30:00+05:30")
Out[57]: Timestamp('2015-11-18 15:30:00+0530', tz='pytz.FixedOffset(330)')*

【讨论】:

  • 感谢大卫的回复。执行替换代码时出现 AttributeError: df['timestamp'] = pd.to_datetime(df['timestamp'].str.replace('\+.*', '')) "AttributeError: Can only use .带字符串值的 str 访问器!"
  • 您的 dt.tz_convert(None) 代码运行良好。我必须先使用 UTC=True 将列转换为 datetime 类型,然后应用您的 tz 转换,我得到了正确的时间(即 -2 小时,即 2011-10-01 00:38:44 给了我 2011-09- 30 22:38:44)
【解决方案2】:

在您拥有的代码行之后。试试:

df_log['time:timestamp'] = datetime.strptime(df_log['time:timestamp'], '%Y-%m-%d.%H:%M:%S')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多