【问题标题】:How Do I Convert DMS to DD in Pandas?如何在 Pandas 中将 DMS 转换为 DD?
【发布时间】:2021-06-26 23:35:36
【问题描述】:

我对 python 编程非常陌生,目前正在执行我的第一个项目。然而,此时此刻,我已经完全停顿了。我查看了许多解决方案,但似乎都没有。

我有一个包含伦敦 32 个行政区的经纬度坐标的 Pandas 数据框,格式如下,坐标是东西方的混合,但纬度保持不变(北):

  1. 巴金和达格纳姆 51°33′39″N 0°09′21″E
  2. 巴尼特 51°37′31″N 0°09′06″W
  3. 贝克斯利 51°27′18″N 0°09′02″E
  4. 布伦特 51°33′32″N 0°16′54″W
  5. 布罗姆利 51°24′14″N 0°01′11″E

我需要格式化坐标,使它们看起来像这样:

  1. 巴金和达格纳姆 51.560833 0.155833
  2. 巴内特 51.625278 -0.151667
  3. 贝克斯利 51.455000 0.150556
  4. 布伦特 51.558889 -0.281667
  5. 布罗姆利 51.403889 0.019722

我已经走到这一步了:

pattern = r'(?P<d>[\d\.]+).*?(?P<m>[\d\.]+).*?(?P<s>[\d\.]+)'

dms = df['Latitude'].str.extract(pattern).astype(float)

df['LATITUDE'] = dms['d'] + dms['m'].div(60) + dms['s'].div(3600)

dms = df['Longitude'].str.extract(pattern).astype(float)

df['LONGITUDE'] = dms['d'] + dms['m'].div(60) + dms['s'].div(3600)

我需要的是考虑方向。

我该怎么做?

【问题讨论】:

    标签: python pandas coordinates latitude-longitude


    【解决方案1】:

    按照您已经使用的相同模式,添加正则表达式组以捕获半球字母

    ...]+).*?(?P<h>[NSWE])
    

    使用str.extract,但不要转换为浮点数。应用 Pandas map 函数将字母转换为数字,然后将转换应用到 float。更改用于计算 de latitude 和 longitude 的公式以考虑半球方向,如下所示。

    pattern = r'(?P<d>[\d\.]+).*?(?P<m>[\d\.]+).*?(?P<s>[\d\.]+).*?(?P<h>[NSWE])'
    hemisphere_sig = {'N': 1, 'S': -1, 'E': 1, 'W': -1}
    
    dms = df['Latitude'].str.extract(pattern)
    dms['h'] = dms['h'].map(hemisphere_sig)
    dms = dms.astype(float)
    
    df['LATITUDE'] = dms['h'] * (dms['d'] + dms['m'].div(60) + dms['s'].div(3600))
    
    dms = df['Longitude'].str.extract(pattern)
    dms['h'] = dms['h'].map(hemisphere_sig)
    dms = dms.astype(float)
    
    df['LONGITUDE'] = dms['h'] * (dms['d'] + dms['m'].div(60) + dms['s'].div(3600))
    print(df)
    

    输出

                                               0    Latitude  Longitude   LATITUDE  LONGITUDE
    0  Barking and Dagenham 51°33′39″N 0°09′21″E  51°33′39″N  0°09′21″E  51.560833   0.155833
    1                Barnet 51°37′31″N 0°09′06″W  51°37′31″N  0°09′06″W  51.625278  -0.151667
    2                Bexley 51°27′18″N 0°09′02″E  51°27′18″N  0°09′02″E  51.455000   0.150556
    3                 Brent 51°33′32″N 0°16′54″W  51°33′32″N  0°16′54″W  51.558889  -0.281667
    4               Bromley 51°24′14″N 0°01′11″E  51°24′14″N  0°01′11″E  51.403889   0.019722
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2014-08-11
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多