【问题标题】:how to get iterate a date time list to get year如何迭代日期时间列表以获取年份
【发布时间】:2016-01-30 19:36:00
【问题描述】:

我想用下面的代码只打印几年,但它似乎容易出错,我尝试并询问了很多次但没有得到正确的结果

import pandas as pd
from datetime import datetime

data = pd.read_csv('Meteorite_Landings.csv')
a = str(data["year"])
print a
for i, val in enumerate(a):
    b=[datetime.strptime(date, '%m/%d/%Y %H:%M:%S %p').year for date in a]
    print b

我收到这个错误

Traceback(最近一次调用最后一次):文件 “C:/Users/shiv/Desktop/new_date_times.py”,第 9 行,在 b=[datetime.strptime(date, '%m/%d/%Y %H:%M:%S %p').year for date in a] 文件“C:\Python27\lib_strptime.py”,行325,在_strptime (data_string, format)) ValueError: 时间数据 '0' 与格式 '%m/%d/%Y %H:%M:%S %p' 不匹配

【问题讨论】:

  • a 是一个字符串。如果您对其进行迭代,您将一次获得字符。我不熟悉 pandas,但是data 是什么类型?尝试直接迭代 data["year"] 而不将其转换为字符串。
  • 在这里发布一个 csv 文件的样本将是一个巨大的帮助。同样正如@L3viathan 指出的那样,您已将a 显式转换为str,因此对其进行迭代只是一次给您一个字符以传递给strptime。
  • 您还应该在此处发布 CSV 的一部分或相关部分,否则很难猜出正确的格式。
  • 您还进行了两次迭代:一次使用 for 循环,一次使用列表理解。

标签: python datetime datetime-format


【解决方案1】:

如果没有您尝试读取的 csv 文件,我无法 100% 确定,但您似乎正在尝试将“年份”列转换为日期时间,然后从中提取年份。你确定你想要的列叫做“年”吗?您确定每一行在该列中都有一个值吗?您确定该列中的每个值都遵循完全相同的格式,并且是您在 strptime 中使用的格式吗?一个名为“年”的列会包含整个日期,这对我来说似乎很奇怪。在这里发布 csv 文件的样本将是一个巨大的帮助。对上述问题做出一些假设,我从您的示例中修改了以下代码。

import pandas as pd
from datetime import datetime

data = pd.read_csv('Meteorite_Landings.csv')

b=[datetime.strptime(date, '%m/%d/%Y %H:%M:%S %p').year for date in data["year"]]

print b

【讨论】:

  • 我编辑了这篇文章。可能已全部使用,但以上一个给出错误 b=[datetime.strptime(date, '%m/%d/%Y %H:%M:%S %p').year for date in data["year" ]] TypeError: 必须是字符串,而不是浮点数
  • @HariRama 你能发布 csv 文件的前几行吗?作为文本,而不是屏幕截图。
【解决方案2】:

我提出了这个解决方案,与你的相差不大:

import pandas as pd
from datetime import datetime

data = pd.read_csv('Meteorite_Landings.csv')

for i, val in enumerate(data["year"]):
    try:
        b = datetime.strptime(val, '%m/%d/%Y %H:%M:%S %p').year
        print b
    except TypeError:
        pass

这会打印年份。 try-except 的原因是 the dataset you're probably using 不完整并且包含一些 NAN (?)。

【讨论】:

    【解决方案3】:

    我可以建议一种不同的方法来解决您的问题吗?您正在使用 pandas 读取 CSV,然后对其进行迭代。这非常慢,并且有不使用 Pandas API 的缺点。而是像这样读取文件:

    dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    
    df = pd.read_csv('Meteorite_Landings.csv', parse_dates=['datetime'], date_parser=dateparse)
    

    请注意,您必须将字符串格式调整为适合您的格式。 现在您将有一列带有日期的日期框架,您可以直接访问year,如下例所示:

    In [1]: import datetime
    In [2]: obj = datetime.datetime.now()
    
    In [3]: obj.year
    Out[3]: 2016
    

    【讨论】:

      猜你喜欢
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2016-12-11
      • 2023-03-22
      相关资源
      最近更新 更多