如何使用Pandas从yyyymmdd中查找一年中的天数?

2024-06-09 07:25:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据:

Date        Time      VCD    
20041001    184531      293.7
20041001    202316      305.4
20041002    175015      322.9
20041002    192822      316.6
20041003    183314      334.4

我正在使用这个代码

^{pr2}$

使用clw1,使用新列“DateTime”yyyy-mm-dd删除重复数据

Date        Time      VCD       DateTime
20041001    184531      293.7   2004-10-01
20041002    175015      322.9   2004-10-02
20041003    183314      334.4   2004-10-03

我正在尝试获取年、月数和月日(在frame1中添加相应的列,例如在frame1中添加一个新的列,表示一年中的某一天(1….365 of 20014)

frame1['doye'] = frame1['DateTime'].apply(lambda x: dt.DatetimeIndex.dayofyear('DateTime'))

但错误:AttributeError:模块“datetime”没有属性“DatetimeIndex” 使用熊猫0.20.2版本 可能我对Pandas和datetime的概念有问题,许多解决方案建议使用单个数据(值),或者对于旧的Pandas版本,如何使用dataframe处理列?在


Tags: 数据代码版本pandasdatetimedatetimevcd
3条回答

方法1:使用apply()(不如方法2)

试着使用这个:

frame1["doye"] = frame1.DateTime.apply(lambda s: s.timetuple().tm_yday)

这将一个函数应用于DateTime列,因此lambda将返回列中的每个DateTime。因此s是一个DateTime对象。我使用timetuple()函数来获得一个^{}对象,该对象的成员是tm_yday,它给你一年中的哪一天。在

这是我的测试代码:

将numpy作为np导入

^{pr2}$

结果是:

       Date    Time   DateTime
0  20041001  184531 2004-10-01
       Date    Time   DateTime  doye
0  20041001  184531 2004-10-01   275

方法2:使用.dt(更好:)

啊,正在读.dt存取器here。。。Pandas系列的.dt访问器将该系列的每个成员视为日期时间,因此当您将其应用于整个系列时,所有内容都必须是datetime。当您将其应用于序列中的列时,apply()函数获取的是datetime对象,而不是series,因此您必须使用datetime方法。在

所以我们不要使用apply()。选择一列datetime将得到一个序列,然后可以使用.dt,因此示例变为:

import pandas as pd
import numpy as np
import datetime as dt

data1 = [ {"Date" : "20041001", "Time" : 184531}]

frame1=pd.DataFrame(data1, columns=['Date','Time'])
frame1["DateTime"]= pd.to_datetime(frame1.Date, format="%Y%m%d", errors='raise')
print frame1
frame1["doye"] = frame1.DateTime.dt.dayofyear
print frame1

下面的代码应该完成您期望的所有步骤:

import pandas as pd
import datetime as dt
frame1 = pd.DataFrame({"Date" : [20041001, 20041001, 20041002, 20041002, 20041003],
                    "Time": [184531, 202316, 175015, 192822, 183314],
                    "VCD": [293.7, 305.4, 322.9, 316.6, 334.4]})

clw1 = frame1.drop_duplicates("Date")
clw1["Datetime"] = clw1["Date"].apply(lambda x: dt.datetime.strptime(str(x), "%Y%m%d"))
clw1["doye"] = clw1["Datetime"].apply(lambda x: int(dt.datetime.strftime(x,'%j')))

clw1的输出是:

^{pr2}$

有一个办法。%j格式代码提供了一年中的哪一天。在

>>> import pandas as pd
>>> df = pd.DataFrame(['20041001', '20041002', '20041003'])
>>> df[0] = pd.to_datetime(df[0])
>>> df
           0
0 2004-10-01
1 2004-10-02
2 2004-10-03
>>> df['day_of_year'] = df[0].apply(lambda x: int(datetime.datetime.strftime(x,'%j')))
>>> df
           0  day_of_year
0 2004-10-01          275
1 2004-10-02          276
2 2004-10-03          277

相关问题 更多 >